annotate Changes @ 165:6409ff6bc219 short-support-first

short
author kono
date Mon, 24 Nov 2003 10:42:03 +0900
parents 1c2a9232ea93
children 9e55cc5551fb
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
59
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
2 Thu Nov 25 17:27:12 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
3
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
4 subroutine call がない
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
5 局所変数もない
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
6 その代わり、大域変数を多用する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
7 大域変数のスコープは局所的
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
8 Fortran の用に局所変数は静的に取る
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
9 recursion する時には、自分で保存する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
10 subroutine call時のレジスタのセーブも局所的に行う
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
11 それは、ちょっと変じゃない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
12 やっぱりデフォルトのフレームは持ち歩くか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
13
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
14 recursive call とそうでないのを区別するか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
15
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
16 fp は用意する方が良い
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
17
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
18 関数定義と同時に、それ専用のfpの構造体を用意する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
19
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
20 C をcompileする時には、stackを持ち歩く
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
21 fp = (struct func_state *)stack
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
22 えっと、どこに代入するの? そういう問題もあるわけね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
23 じゃあ、fpは特別? それは気に入らないな。static
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
24 なfpにすれば良いわけね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
25
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
26 func(void *stack) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
27 static struct func_state {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
28 static struct func_state *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
29 int local1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
30 brahbrah...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
31 } func_state; // ここまで hidden
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
32 func_state.fp = (stack -= sizeof(struct func_state));
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
33 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
34
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
35 func_state をとってくる演算子があった方が良い? そうね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
36 func.state
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
37 ぐらい?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
38
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
39 fp->local1 みたいなことだけするなら、C と同じになる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
40
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
41 call する時のarguemnt も、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
42 static な func_state に置く
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
43 stack 上の func_state に置く
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
44 という二通りの選択肢がある。Cと互換なら、当然、後者。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
45
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
46 Recursive なら後者だが、この言語は状態遷移を記述するから、static
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
47 なものでも良いはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
48
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
49 Internal function は? あってもいいんだけど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
50
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
51 Recursive call する時には、 fp をsaveする必要があるね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
52 (--(struct func_state *)stack) = fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
53 call callee(&fp->arg,continuation,stack);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
54 call しても、戻って来ないから... continuation は一般的にはcode
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
55 だから... それは Internal function にするか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
56
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
57 continuation に一般的にcompileする方法を考えないといけないか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
58 self は必要なわけね?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
59
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
60 言語の名前も考えないといかんなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
61
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
62 C からのコンパイラも書かないといけないのか...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
63
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
64 Mon Dec 13 18:53:04 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
65
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
66 compiler based で、内部で partial evaluation できる?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
67
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
68 func をdatabaseとして扱えないなら、それはできない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
69
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
70 しかし、状態遷移としては取り扱える。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
71
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
72 func.state
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
73 func.code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
74
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
75 みたいな形にしてpartial evaluationすれば良い
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
76
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
77 でも止まるのか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
78
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
79 textual でない、中間的なコード表現があった方が良い? <-> interpreter?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
80
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
81 Prolog ではなんでいけないの? --> Unification が重いから
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
82
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
83 Sat Nov 27 13:50:41 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
84
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
85 func.state とか作るのだったら、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
86 struct {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
87 struct {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
88 int i;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
89 } state;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
90 state *code = {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
91 i = i+1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
92 };
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
93 } name;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
94 みたいな形で、それ自体を構造化すれば? で、代入すると部分評価される。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
95 代入も可能。なるほど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
96 *name.code;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
97 値はあるわけ? 値は &state でしょうね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
98 self があれば、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
99 struct {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
100 struct {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
101 int i;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
102 } state,
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
103 *code = {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
104 self->i = self->i+1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
105 };
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
106 } name;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
107 かな。self = state だよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
108
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
109 union の拡張もあわせて議論すると...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
110
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
111 Partial evalutator をセマンティクスや実行系にいれておくことは可能か?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
112
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
113 byte code とか仮想マシンだったら可能。そうでない場合は?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
114
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
115 いずれにせよ、構造体のタグのunique性を修正しないとだめだな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
116
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
117 ヘッダファイルはどうするの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
118
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
119 Mon Dec 13 18:53:18 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
120
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
121 library との整合性は?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
122
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
123 exec sequence では、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
124 (--(struct func_state *)stack) = fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
125 call callee(&fp->arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
126 という形でpointerだけ渡すの? それは変だよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
127
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
128 値渡しにするとすれば、複数の値を渡せたほうが良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
129
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
130 func(void *stack) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
131 static struct func_state {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
132 static struct func_state *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
133 int local1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
134 brahbrah...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
135 } func_state; // ここまで hidden
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
136 func_state.fp = (stack -= sizeof(struct func_state));
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
137 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
138
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
139 の引数自体が、構造体であるべき。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
140
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
141 func(
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
142 struct void *stack
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
143 ) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
144 static struct func_state {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
145 static struct func_state *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
146 int local1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
147 brahbrah...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
148 } func_state; // ここまで hidden
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
149 func_state.fp = (stack -= sizeof(struct func_state));
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
150 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
151
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
152 で、構造体に register storage を許す。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
153
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
154 func(
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
155 static struct argment {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
156 register void *stack;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
157 register void *continuation;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
158 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
159 ) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
160 static struct func_state {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
161 static struct func_state *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
162 int local1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
163 brahbrah...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
164 } func_state; // ここまで hidden
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
165 func_state.fp = (stack -= sizeof(struct func_state));
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
166 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
167
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
168 すると、caller の方も、構造体を引数とするのが自然。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
169
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
170 call caller(
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
171 static struct argment {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
172 register void *stack;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
173 register void *continuation;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
174 } arg = {a,b};
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
175 )
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
176
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
177 みたいな。もちろん、この構造体はインタフェースと呼ばれる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
178
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
179 argument は、callee にあった方が良いけど、caller 側にあっても
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
180 良い。register なんかは、そう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
181
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
182 caller(interface caller_arg = {a,b,c})
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
183 みたいなsyntax かな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
184 caller->interface = {a,b,c};
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
185 *caller->code;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
186 を、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
187 caller(a,b,c);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
188 と称する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
189
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
190 function には、interface と code と state があることになる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
191
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
192 state にアクセスする時のlockは? protected state? synchonized state かな?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
193 もちろん、sequential implementatoinでは、そんなものはいらない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
194
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
195 function {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
196 interface:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
197 register int a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
198 register struct self self;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
199 state:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
200 int b;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
201 serialized int c;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
202 code:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
203 b = a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
204 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
205
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
206 int にvoid value を定義する。実装は重くなるけど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
207
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
208 serialzed の semantics は?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
209
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
210 もう少しmicro-Cに近く!
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
211
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
212 carring state と static state。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
213
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
214 Mon Dec 13 19:42:41 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
215
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
216 interface に regsiter keyword を使うのは、あまりに
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
217 実装よりすぎる。でも、でないと状態にできない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
218 そんなことはないか。やっぱりcaller側のstatic 領域に
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
219 直接書き込む?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
220
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
221 だとCより遅そう。でも、引数に40個とかかかれたら...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
222
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
223 Wed Dec 15 14:09:49 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
224
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
225 C と互換にする?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
226 goto function(argments);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
227 goto *continuation(argments);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
228 みたいな感じで。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
229
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
230 stackの管理は? どうせ、library との互換はとらないと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
231 いけないんだから...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
232
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
233 local 変数がある場合は stack を動かす。でも、戻す奴がいない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
234 closure 化するか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
235
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
236 return した時の挙動が複雑になる。大域returnするわけだら。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
237
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
238 argments をstatic 領域にかきこむ方式だと互換性がとれない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
239 stack 上の frmae pointer 上にないとダメだから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
240
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
241 両立させるのは無理か? つまり、これだと、呼び出された方の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
242 frame semantics は、C と互換になる。だから、stackの直後に
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
243 frame pointer があると思っている (そうか? ) frame pointer
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
244 stack pointer に沿って移動した直後に、そこからのoffset
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
245 で引数を操作することになる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
246
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
247 つまり、それはだめだったことじゃない? つまり、goto だと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
248 frame pointer は、stack の直後とは限らないから。前の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
249 frmae pointer 相対に引数にアクセスしてくれれば別だけどね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
250
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
251 stack に引数を積むのは容認して、goto の場合は、向こう側で
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
252 stack を畳むってのは? ということは、普通の関数と定義の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
253 方法を変えるってことか。ま、悪くはないか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
254
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
255 すると、goto のsemantics は、C と互換になる。それを受ける
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
256 方が異なることをする。それは、なんかおかしいな。それに、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
257 それだと関数呼び出しが軽くならない...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
258
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
259 ということは、やはり、C のcall は、call funciton で
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
260 実現して、その他の呼び出しは、すべて、goto 扱いに
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
261 する方が正しいだろう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
262
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
263 問題は、この言語の関数をcallされた時だな。dual entry にして、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
264 call の時と、goto の時を区別するか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
265 func: stack processing
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
266 func_goto: normal processing
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
267 ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
268 みたいな感じ。でも、return はないから...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
269
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
270 このあたりも自分で記述できる言語であるべきだよね。その通り。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
271 つまり、C とのstub も自分で記述すると言うことか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
272
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
273 protocol function {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
274 interface c {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
275 register "%esp" struct {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
276 entry code ret(int);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
277 void *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
278 } *sp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
279 register "%ebp" void *fp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
280 };
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
281 code function_code {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
282 fp = sp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
283 sp += sizeof(struct local);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
284 struct local *local = sp;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
285
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
286 local->i = 1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
287 goto *fp->ret(local->i),sp=fp; // return(local->i);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
288 };
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
289 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
290
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
291 みたいな感じでさ。さっすが、アセンブラ。いまいちreturnが汚いけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
292 まぁ、return はそのままreturnでもいいけどさ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
293
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
294 あ、これは良いかも知れない。code が複数かけるから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
295
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
296 state 以外は、consitent state であることを保証しない。ってのは?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
297 local 変数は使っても良いけど、call/goto の前後で、値を保証しないか...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
298
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
299 うーん、だんだん炸裂してるなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
300
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
301 だから、レジスタに対するマッピングの記述と、そうでない部分の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
302 記述は分離するべきでしょうね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
303
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
304
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
305 全部一辺に実装するわけにはいかないからぁ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
306
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
307 Thu Dec 16 13:44:21 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
308
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
309 lock は状態遷移レベルで実現するのだから、self などを
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
310 使ってlockする必要はないはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
311
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
312 全体の直列化は、状態遷移レベルで、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
313 lock(storage) -> transition
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
314 みたいな形で記述すれば良い。この当たりを、どのように記述するかは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
315 もう少し先送りしよう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
316
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
317
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
318 引数はレジスタ渡しにしよう。長い引数は、呼び出し側の領域への
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
319 ポインタとする。実装を規定しても良い。そうすれば、varargs
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
320 みたいなものはなくなる。だいたい、なんで、そんなものがいるんだろう?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
321 配列を渡せばいいじゃん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
322
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
323 なので、引数は一つ(or 二つ)に限るという方法もある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
324
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
325 とすると、やはり、前もって静的領域や動的領域を確保することは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
326 できない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
327
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
328 この言語では動的領域は自分で確保するわけだから、その点は問題ない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
329
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
330 Thu Dec 16 20:24:55 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
331
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
332 とすると関数呼び出しは、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
333 # register save
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
334 # set 1st argument in register %eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
335 # set 2nd argument in register %ecx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
336 # set extra aguments in save area
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
337 # set extra argument pointer in %edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
338 jmp function
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
339 という形式になるわけね。second を処理するのはめんどくさいから一つ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
340 にしよう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
341
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
342 えーと、frame pointer はないけど、コンパイルの手順からすると
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
343 あった方が良い。しかし、frame pointer そのものをstatic
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
344 にとるのはまずい。だから、frame pointer がfirst argment
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
345 ということにする方が正しい。とすると引数は、さらに、その
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
346 後と言うわけか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
347 f(fp,argment)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
348 fp を渡すのにさらにargment をレジスタで渡すのはおかしい。おかしいけど、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
349 ま、良いか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
350
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
351 return しないなら、return type の定義をとるのは変だな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
352
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
353 f(fp,arg1,arg2,arg3) とすると、それぞれが決まったレジスタに入って、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
354 多い分は配列にあると思われる。ふむふむ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
355 fp->xx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
356 でアクセスすれば、そのまま局所変数になる。全部、配列で
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
357 送っても良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
358
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
359 .set label,value
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
360
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
361 で as は値をセットするようですね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
362
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
363 関数コールの後は戻って来ないから後始末の心配はしなくてよい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
364 frame pointer を使ったら自分で面倒を見ること。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
365
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
366 だと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
367 a = atoi(s);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
368 みたいなことはできない...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
369
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
370 普通のCの定義と交じると間違いやすい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
371
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
372 とすると、struct と同様に、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
373 protocol
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
374 code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
375 interface
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
376 state
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
377 を用意するわけね。時間あるのかぁ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
378
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
379 とりあえず、register 渡しのfunction 定義とgoto文を実装する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
380
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
381 code name(register "%ebp" void *arg) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
382 goto name(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
383 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
384
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
385 ぐらいかな? で、first argment が必ずregisterにのるようにしないと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
386 いけない。register storage class を入れて、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
387 register "%ebp" void *arg
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
388 とかするわけね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
389
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
390 ってことは、まず、レジスタを実装しないといけないわけね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
391
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
392 で、stack を使った演算は、一応、そのままにする? それでも動くはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
393 式の途中でgotoは使えないんだから、それでいいはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
394
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
395 で、それから、これを拡張していく。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
396
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
397 interface c {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
398 register "%ebp" void *arg;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
399 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
400 code name(interface c) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
401 goto name(c.arg); // c. は省略可能
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
402 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
403
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
404 とかね。さらに、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
405
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
406 protocol name {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
407 interface c {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
408 register "%ebp" void *arg;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
409 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
410 code name(interface c) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
411 goto name(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
412 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
413 code name1(interface c) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
414 goto name(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
415 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
416 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
417
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
418 などとするわけか。なんと、これが C と共存するわけね。うーん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
419
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
420 Fri Dec 31 11:44:03 JST 1999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
421
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
422 code でなくて、別な名前のほうが良くない? segment? action?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
423
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
424 レジスタ名が入るのは、やっぱりいや。optionalには許す。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
425
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
426 interface は構造体のようなものだから... 構造体でいいんじゃない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
427 構造体の場合は... malloc する? う、うーん。malloc するとして、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
428 いつfree するの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
429
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
430 再入するときには、壊れてていいんじゃない? multi-thread でなければね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
431 multi thread では、状態は、レジスタ経由または、thread local に持つ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
432 必要がある。static は、だから thread local に持たなくてはならない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
433 大域変数に割り振っちゃだめ。でも、いまは、やめて
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
434
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
435 interface は、とりあえず、二つまでの値渡しにしよう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
436 self と arg
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
437 ですね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
438
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
439 もう少し拡張しやすいコンパイラがいいなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
440
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
441 code name (c,a)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
442 struct state *c; struct arg *a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
443 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
444 goto name(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
445 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
446
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
447 local 変数は? この互換性の問題かぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
448
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
449 KL/1 を意識して、interface は heap に置くことにしても良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
450 GC は言語に入れておくべきだが、interfaceは machine independent
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
451 であるべき。だとすれば use/forget みたいものはいるだろう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
452 でも今のところは考える必要はない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
453
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
454 えーと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
455 code name (c,a)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
456 struct state *c; struct arg *a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
457 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
458 int i;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
459 goto name(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
460 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
461 の時の一時変数iはどうするの? 基本的にはレジスタ割り当てだけど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
462 使用させない? んー、大胆な御意見。まぁ、やっぱりheapに割り当てちゃう
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
463 のが簡単か。でも、どうせ抜ける時にはいらなくなるわけだから...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
464
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
465 ほんらい、この変数は、次のcallでは必要無くなるのが普通。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
466
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
467 とにかく、レジスタ変数は必要なんでしょう?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
468
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
469 だから、GC と合わせて言語を設計すべきだよね。API を規定して、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
470 異なるGCを選択できるようにする。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
471
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
472 Sat Jan 1 22:40:22 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
473
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
474 とーにかく、 storage class regisgter を実装しよう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
475
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
476 stmode=REGISTER
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
477
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
478 で、local storage とおなじ扱いとする
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
479 static register? は、ない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
480
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
481 symbol table に storage class をたせば? dsp==EXTRN で判定しているから、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
482 local 変数が36以上あるとおかしくなるぞ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
483
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
484 sc は GVAR/LVAR だけど、regsiter は LVAR の特殊な奴だから、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
485 sc に入れるほうが正しいか...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
486
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
487 Sun Jan 2 01:47:17 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
488
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
489 register 変数はできました。けど、regsiter を二つ使うと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
490 一杯になってしまうので、REGISTER6 でコンパイルしないと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
491 結構ひどい。が、register 変数を%esi,%edi に割り当てれば
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
492 いいか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
493
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
494 Sun Jan 2 04:43:04 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
495
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
496 で、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
497 code name (c,a)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
498 struct state *c; struct arg *a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
499 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
500 goto name(c);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
501 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
502 の一時変数無しは実装できます。引数は二つまでね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
503
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
504 .file "tmp.c"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
505 .version "01.01"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
506 gcc2_compiled.:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
507 .text
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
508 #
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
509 # code name(c,a)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
510 .align 2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
511 .globl code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
512 code:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
513 .type code,@function
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
514 # struct state *c; struct arg *a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
515 # {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
516 # goto name(c);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
517 movl %esi,%esi
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
518 jmp name
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
519 _5:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
520 .size code,_5-code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
521 .ident "Micro-C compiled"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
522
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
523 う、すごい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
524
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
525 goto 文がめんどくさい。stack をたたんで、jmp すれば
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
526 よいだけだが..
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
527
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
528 Sun Jan 2 11:17:50 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
529
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
530 普通のcallをcontinuation baseにすることができる?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
531
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
532 Sun Jan 2 20:28:45 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
533
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
534 goto 文だけど、やはり、一度、expr で生成してから、top level
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
535 で jump code を生成しよう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
536
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
537 Tue Jan 4 03:32:55 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
538
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
539 code をtypeにしないと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
540 code *p;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
541 とか書けないね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
542 int *p();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
543 と同じだけどさ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
544
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
545
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
546 main(ac,av)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
547 int ac;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
548 char *av[];
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
549 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
550 goto code1(ac,av);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
551 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
552
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
553 code code1(ac,av)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
554 int ac;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
555 char *av[];
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
556 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
557 if (ac)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
558 goto code1(ac,av);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
559 else
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
560 goto ac(ac,av);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
561 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
562
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
563 Tue Jan 4 04:56:56 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
564
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
565 うーん、なんかレジスタにつむ順序が違う
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
566 これは、adecl がreverseにつむから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
567
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
568 code のretrun
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
569
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
570 やはりcodeはtypeにしないとだめ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
571
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
572 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
573 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
574 goto code1();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
575 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
576
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
577 とかだと、main に戻って来れない。もちろん、code1() 以降で、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
578 return するわけにはいかない。(main の disp をcode1 は知り得ない)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
579 goto label をcode1の引数に送れば?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
580
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
581 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
582 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
583 goto code1(ret);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
584 ret:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
585 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
586
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
587 これだと、ret がforward labelかどうか分からないけど?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
588
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
589 code1 中で使う中間変数を stack 上にとるのは悪くない。しかし、それを
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
590 %ebp 経由でアクセスするということは、main の中間変数を壊すということ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
591 それを防ぐには、main 中のgoto codeで、%ebp を修正してやれば良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
592 (今は戻って来ないので問題ない)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
593
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
594 code1 のgoto では、戻って来ないから、その必要はない。しかし、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
595 label をcode1 中で渡されると、ちょっと気まずい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
596
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
597 とすると、それは禁止して、main() 中でstackをたたんでからgotoするか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
598 そうすると、無限後退して、結局、帰れないことになる... うーん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
599
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
600 main() 中のlocal code を許せば、それは解決するが..
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
601
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
602 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
603 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
604 goto code1(code2);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
605 code code2() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
606 return;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
607 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
608 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
609
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
610 みたいな感じ。でも、そうするとscope rule を変える必要があるので厳しい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
611 ま、悪くはないけどね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
612
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
613 continuation を明示する方法もある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
614
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
615 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
616 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
617 goto code1(continuation);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
618 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
619 code code1(ret)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
620 code (*ret)();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
621 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
622 goto *ret;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
623 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
624
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
625 かな? call/cc ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
626
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
627 label へのgotoを許すのもいいけど、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
628 でも、label を許すと、すごくspagettyにならない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
629
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
630
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
631 Tue Jan 4 11:47:24 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
632
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
633 contiunation じゃなくて、return keyword を使おう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
634 (実際、continuation と少し違うし)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
635 type が少し変になるけど、まあ良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
636
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
637 int
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
638 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
639 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
640 goto code1(return);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
641 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
642 code code1(ret)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
643 code (*ret)(int);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
644 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
645 goto *ret(3);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
646 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
647
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
648 だな。prototype も付けないといけないか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
649
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
650 Tue Jan 4 12:21:44 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
651
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
652 これだとmethodがすべてstatic になってしまう。dynamic なmethod
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
653 呼び出しにするには? dipatcher を自分で作ることになる。かなり
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
654 めんどくさいが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
655
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
656 code method(obj,arg)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
657 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
658 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
659
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
660 か、あるいは、inline にするか... #define のかわりに inline ねぇ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
661 これはあとで考えて良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
662
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
663 Tue Jan 4 14:22:19 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
664
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
665 main の変数を書き潰すのと、gotgo (*reg)(123) での値は、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
666 register 渡しで、current register にのらないので、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
667 結局、return label は専用に作る必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
668
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
669 Tue Jan 4 18:14:07 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
670
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
671 stack を継ぎ足して、呼び出す方式を取れば、call by value
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
672 のregister 渡しを制限する必要は無くなる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
673
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
674 複数の値を返すことも容易だ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
675
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
676 .file "tmp.c"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
677 .version "01.01"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
678 gcc2_compiled.:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
679 .text
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
680 #
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
681 # code name(a,b,c,d,e,f)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
682 .align 2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
683 .globl code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
684 code:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
685 .type code,@function
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
686 # struct arg *a,*b,*c,*d,*e,*f;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
687 # {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
688 # int g;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
689 # goto name(a,b,d,e,f);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
690 jmp name
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
691 _5:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
692 .size code,_5-code
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
693 .ident "Micro-C compiled"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
694
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
695 おお?!
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
696 %esp new %esp = old %esp - 12 -4
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
697 %ebp-4 = g
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
698 %esi = a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
699 %edi = b
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
700 %ebp = old %esp 0
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
701 %ebp+4 = c code_arg_offset=0
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
702 %ebp+8 = d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
703 %ebp+12 = e
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
704 %ebp+16 = f
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
705
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
706 interface は付けよう! というか、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
707 goto name(struct {xxxx})
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
708 みたいな感じで良いわけね。どれをregisterにいれるかと言う問題はあるが。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
709
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
710 で、どうやってcallすればいいわけ? emit_pushするかわりにpush
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
711 する?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
712
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
713 うう、これでは、だめか。code argument の数が変わると、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
714 ebp をいちいち動かすことになる。そこにはold sp があるから
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
715 そいつもコピーする必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
716
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
717 %esp new %esp = old %esp - 20
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
718 %ebp-20 = g
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
719 %esi = a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
720 %edi = b
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
721 %ebp-16 = c code_arg_offset= -16 ((nargs-max_reg)*int_size)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
722 %ebp-12 = d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
723 %ebp-8 = e
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
724 %ebp-4 = f
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
725 %ebp = old %esp 0
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
726
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
727 そうか、function からcallする時には、local 変数を書き潰して良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
728
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
729 # goto name(a,b,d,e,f);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
730
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
731 %esp new %esp = old %esp - 20
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
732 %ebp-20 = g
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
733 %esi = a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
734 %edi = b
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
735 %ebp-16 = c code_arg_offset= -16 ((nargs-max_reg)*int_size)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
736 %ebp-12 = d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
737 %ebp-8 = e
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
738 %ebp-4 = f
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
739 %ebp = old %esp 0 disp=0 (*)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
740 local1 <----16 local variable
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
741 %edx -12 <- disp_offset
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
742 %ecx -8
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
743 %ebx -4
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
744 %ebp = %esp 0
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
745 %eip 4 <- arg_offset
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
746
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
747 となる。ということは、pushl %ebp は、間違い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
748
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
749 だけど、%ebp をそのまま使うのは良くない。disp_offset がかかっているから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
750 だから、もう一度 pushl %ebp したほうがよい。しかし、push する先は、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
751 上の、(*)。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
752 leave movl %ebp,%esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
753 popl %ebp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
754 じゃなかったか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
755
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
756 Thu Jan 6 13:00:33 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
757
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
758 できたね。これでとりあえず動くはず。速度は問題だが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
759 あとは、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
760 ANSI-C prototype
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
761 ANSI-C prototype check
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
762 Interface Definietion
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
763 GC support
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
764 Direct handling of Frame
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
765 だね。簡単に出来そう? たぶん...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
766
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
767 Fri Jan 7 09:42:53 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
768
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
769 goto 文が動いてなかった。あと peep hole optimization version も
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
770 作るか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
771
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
772 continuation として label を送れるようにするべきか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
773 そうすると便利なんだけど、ちょっと、汚いプログラムが
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
774 出来るようになる。あと、送り側の環境(frame)を維持する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
775 必要がある。ま、できなくはないか...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
776
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
777 そうすると、label が値を持つようになる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
778 a = label:;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
779 とか。うーん。label:(a,b,c) {}; みたいな形で、parallel 代入を許すと言う
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
780 手もあるね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
781
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
782 こちらの方がCとの相性は良いが... main() { label:(){ ... } }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
783 みたいなnestを許すかどうかと言う問題がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
784 変数の参照を許さなければ、特に問題はない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
785
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
786 a = label: は、二重の意味があるなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
787
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
788 言語の名前。DinnerBell II とか? join も入れる?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
789 code entry_a().entry_b() {}
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
790 ですか? parallel call も?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
791
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
792 Fri Jan 7 19:53:53 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
793
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
794 いまのままだと return が環境を持ってないから、大域脱出できない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
795 まぁ、環境を入れてもいいんだけど、どこに置くかと言う問題が
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
796 あるね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
797
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
798 そうじゃなくて、return 側で判断するか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
799 retrun(ID)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
800 みたいな形でIDで判断する。そうすれば、return 側でID
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
801 を見て判断できる。けど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
802
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
803 まぁ、はやり、環境を持って歩く方がいいかなぁ。でも、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
804 引き渡しているから、二つ引き渡して、片方を使われたときに、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
805 反対側が消えてしまうのはいたいよね。今のままならば、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
806 そういうことは起こらない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
807
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
808 continuation 特有の問題を避けるなら、このままでもいいんだが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
809 contrinuation や環境は、このシステムでは自分で作ることが
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
810 できるからね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
811
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
812 そうなんだけど.... retlabel や retcont は実はオブジェクト
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
813 全体に一つあれば良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
814
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
815 引数を渡すときに、そこに環境へのポインタをいれてやれば良いので、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
816 解決は割と簡単だが、そうすると、例の構造体を引数で渡すと言う
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
817 問題を解決する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
818
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
819 でも、今の実装ならば、まったく同じ変数の構成ならばコピーは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
820 実際には起こらないわけだから問題ないはず。特に、それを保証するために、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
821 interface を実装する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
822
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
823 return ->
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
824 (void *)old bp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
825 return address
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
826
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
827 bp を直接操作できるようにするといいんだけど....
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
828
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
829 Sat Jan 8 08:49:59 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
830
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
831 今は、code 内ではreturnできないわけだけど。実は、return って、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
832 code return0(i) int i; { return(i); }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
833 か? 今は禁止してないから書けちゃうよね。どういうcodeが出るんだろう?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
834
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
835 doreturn() では retpending をセットしているだけだから、control=1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
836 のまま。で、code の終りにくるのでエラーになる。checkret は、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
837 statement の引数で判断するようにしたほうが合理的だろう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
838
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
839 大域脱出は結構根が深いよね。途中をスキップされてうれしいか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
840 destructor と同じで、途中のcodeは全部呼びたいのが普通だろう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
841
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
842 bp が同じになるまで return すれば良いわけだよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
843 return と同じで、明示的に環境を引き渡すようにするか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
844 type は void * で良い?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
845
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
846 return する時にstackの上限を越えているかどうかを自分でチェックする
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
847 必要があるね。誰にreturnするかをcodeで明示すれば良いわけだけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
848
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
849 code return0(i) int i; { return(i); }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
850
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
851 を許して、そこで、frame pointer を大域あるいは渡した引数と
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
852 比較して処理する?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
853 code return0(i,env) int i; env *env; {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
854 if (env==self) return(i);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
855 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
856 あれ? これはおかしいよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
857 code return0(i,env) int i; env *env; {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
858 if (env!=self) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
859 env->return();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
860 return(i);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
861 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
862 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
863 も、なんか変だよなぁ。呼び出しと逆順に帰りたいわけだが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
864 実際、逆順には帰っているわけだよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
865
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
866 return の中でこそこそ比較するという技もあるけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
867
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
868 問題は、destructor に渡す情報だよね。もちろん、self で良いわけだが、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
869 このあたりは、言語外の問題で、それを明示的にしたいから、この言語を
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
870 作っているわけなのだから、これを内部で処理するのはおかしい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
871
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
872 code return0(i) int i; { return(i); }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
873
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
874 これだと、return の型が合わないと言う問題が生じるな。簡単には
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
875 チェックできない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
876 int
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
877 main() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
878 code a() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
879 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
880 code b() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
881 return(i);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
882 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
883 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
884 にすれば、check はできるようになる。でも、これだと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
885 int
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
886 main() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
887 a: {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
888 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
889 b: {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
890 return(i);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
891 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
892 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
893 と差がない。module 化を言語外でやるというのが主旨なのだから、これでは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
894 まずい。これは高級アセンブラなのだから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
895
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
896 あそうか、return と、大域脱出時のabortとは、状況が違う。だから、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
897 別なcode を呼び出さないとだめ。あるいは、値で区別するか。これは、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
898 logic programming のfail/success と似ている。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
899 main() { } abort { ... }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
900 でもいいけど?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
901 main() { code abort { ... }; code return { ... }}
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
902 かな?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
903
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
904 本来、subroutine call自体が、かなりの省略形なわけだから、これは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
905 仕方がない。今のままで通常のsubroutine callをシミュレートできるのか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
906 code (struct arg {...},void *sp) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
907 struct env;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
908 push(sp,arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
909 push(env,arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
910 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
911 できるけど、ちょっと重い。やはり、frame pointer を直接操作しないと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
912 だめ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
913
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
914 goto 文のほうに、env を一緒に送るものを作ったほうがいいのかも。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
915 goto (*ret)(),environment;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
916 かな。type は? (void *)?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
917 goto ret(),environment;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
918 にはならないの? そうすれば、自分でthreadを制御できる。environment
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
919 の正当性を評価しなくて良いの? まぁ、ねぇ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
920
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
921 これは実装は容易だが... goto といちいち書くのが本当にいいのか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
922 env に対するoperationがあった方がいいなぁ。push とか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
923
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
924 code return0(i) int i; { return(i); }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
925
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
926 を認めれば、return 擬変数はいらなくなる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
927
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
928 でも、実は、return は、caller の引数の数と一致してないといけない
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
929 わけだから、 code return0(i) int i; { return(i); } はだめ。env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
930 と一致してないといけない。ということは分離するとまずいんじゃない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
931 あれ? そんなはずないな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
932
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
933 Sun Jan 9 01:15:56 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
934
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
935 やはり、分離してはまずい。もともと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
936 goto func(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
937 自体が、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
938 goto func(arg) with current.env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
939 みたいなものだ。つまり、これは、DinnerBell の、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
940 self message: arg
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
941 と同じ。self->func(arg); でも良い。が、function callと区別が付かないのは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
942 良くない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
943
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
944 そうすると、type code はsize int でなくなる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
945 code *p = func;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
946 ではいけなくて、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
947 code p = {func,env};
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
948 でないといけない。実際、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
949 goto func(arg)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
950 では、current environment を pushl %ebp でstack = current env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
951 に積んでいるわけだから。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
952
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
953 いずれにせよ、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
954 struct p = q;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
955 は実装する必要がある。localな、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
956 code p = {func,env};
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
957 も動くはずだが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
958
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
959 code (*p)();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
960 goto (*p)(arg);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
961
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
962 はだから少しおかしい。これは、goto がenv を補っていると考えるべき。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
963
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
964 このようにすると、常に、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
965 func,env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
966 の組をcodeとみなすことになる。これは、object と呼ぶべきだ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
967 ただ、既存のobjectとは別だよな。actor の方が良い?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
968
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
969 うーん、これでjoinを入れれば、完璧なDinnerBellだな。並列送信はないけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
970
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
971 Sun Jan 9 01:40:05 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
972
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
973 local 変数の初期化はallocation の後に遅らせる必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
974 nptr に入れられるはずだよね? nptr に初期化フラグを足すか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
975
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
976 文途中で出現するlocal変数の初期化。ちゃんと動いているの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
977
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
978 構造体のcopyは、lcheck を修正すべきでない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
979
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
980 Sun Jan 9 08:49:43 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
981
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
982 うーん、なんか修正が多いなぁ。あと、関数呼び出し、goto 文の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
983 構造体への対応か。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
984
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
985 goto (*code)();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
986
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
987 が、self env を使うのか、code の先の値を使うのかを区別する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
988 必要がある。もし*を使わないとするとlabel(FNAME)との区別が
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
989 つかないぞ。あ、でも、環境を持ち歩くことにしたから、label
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
990 へもjumpしようと思えばできるね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
991
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
992 並列送信はなくても、この構成ならばstatement単位の並列性を検出するのは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
993 容易だろう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
994
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
995 やればできるけど、この修正の量だと1日じゃ終らないかなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
996 不動小数点も入れるのでしょう?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
997
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
998 Mon Jan 10 09:00:12 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
999
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1000 引数に構造体を許すには、必ずANSI-Cにする必要がある。難しくは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1001 ないが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1002
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1003 goto 文には label, code, continuation の3つが来る。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1004 continuation = code + env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1005 | label +env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1006 なのだが、code/label では、env の内容が異なる。できれば面白いが、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1007 その価値はあるのか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1008
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1009 しかし、code , env を分離するとあまりに危険すぎる。どうせgoto
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1010 が危険なんだからいいか? その方が簡単。簡単なら、そっちの方法を
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1011 とるべきじゃない? うーん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1012
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1013 return の関数依存性はなくした方が良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1014 一つにするのは、pop の問題があるので良くないが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1015
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1016 そうか、ret をenvを指定して戻るようにしたから、leave する必要は
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1017 なくなった。そして、push %ebp に相当する部分は、lea -disp(%ebp),%sp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1018 で消去されている。ということは、jump のfunction依存部分はいらない
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1019 ということだね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1020
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1021 でも、汚いなぁ。read only属性をhardware supportできればなあ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1022
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1023 sched_yeilds() 相当を書けるかな? lock は?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1024
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1025 一応、できたけど、やっぱり汚い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1026
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1027 Wed Jan 12 16:12:27 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1028
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1029 あは。ANSI prototype はめんどい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1030 bexpr()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1031 で、関数での引数の順序と、そのあとの宣言の順序が変わることがある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1032 そうすると、うしろの方が優先されてしまう。これは、こまる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1033
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1034 そうか、code_arg_offset のような方法だと、ANSI style では、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1035 困ってしまう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1036
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1037 Thu Jan 13 04:46:12 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1038
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1039 # goto name(a,b,d,e,f);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1040 code name { int g; ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1041
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1042 %esp new %esp = old %esp - 20
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1043 %ebp-20 = g code's local variable
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1044 %ebp-12 = f <- new_disp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1045 %ebp-8 = d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1046 %ebp-4 = d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1047 %ebp-0 = c
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1048 %edi = b
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1049 %esi = a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1050 %ebp = old %esp 0 disp=0 new env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1051 local1 <----16 old local variable ( to be erased )
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1052 %edx -12 <- disp_offset
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1053 %ecx -8
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1054 %ebx -4
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1055 %ebp = %esp 0 <- old env
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1056 %eip 4 <- arg_offset
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1057
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1058
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1059 Thu Jan 13 13:38:24 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1060
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1061 だいたいできたけど、test/tmp7.c のprintf のtype mismatch は
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1062 なんなんだろう? ASNI の副作用だろうなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1063
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1064 これだと、プロセスの切替えのときには、結構な量のデータを
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1065 コピーすることになる。それでもいいんだけど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1066
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1067 それごと、どっかにとって置く。continuationへの参照みたいなもの
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1068 ができないかな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1069
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1070 コピーができれば、environment/return の組は動くわけだから、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1071 それへの参照と切替えがあっても良いよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1072
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1073 Fri Jan 14 12:03:35 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1074
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1075 Libretto のkeyboardが壊れた... control key が効かない...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1076
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1077 printf の参照の問題は解決しました。list2 がlocalなheap
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1078 に割り当てているのがいけなかったね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1079
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1080 return の処理は、goto 文で処理するより、environment に
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1081 returnto する方が良くはないか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1082
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1083 environment は実は送り先でそれなりの準備が必要。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1084 new-environment() みたいなlibrary があれば、thread にできる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1085
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1086 join は?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1087
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1088 funcall を用意すると良いね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1089
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1090 Mon Jan 17 15:23:34 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1091
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1092 struct aa f1() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1093 return bb;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1094 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1095
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1096 みたいなのは? 関数の型か代入の型を見て、crn にpointerを渡して、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1097 あとでcopyしてから stack を畳む。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1098
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1099 # bb=f1(aaa);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1100 movl $bb,%eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1101 pushl %eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1102 movl $aaa,%eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1103 pushl %eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1104 call main2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1105 popl %edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1106 copy %eax,%edx,$400
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1107 addl $400,%esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1108 # return a1;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1109
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1110 あ、でも、それだと、local変数を返したときに困るね。leave; ret;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1111 してはいけなくて...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1112
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1113 あ、やっぱり、こういう場合はコピー先をmain2に引き渡しているみたいね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1114 void f1(struct aa *ret) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1115 *ret = bb ;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1116 return;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1117 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1118 と同じか。これは簡単。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1119 f1().a[55]
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1120 みたいな場合は、局所変数に強制的に取ってしまうみたいね。それはそうだ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1121 が、うちの実装だとちょっと厳しいか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1122 leal $-sizeof(struct),%esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1123 pushl %esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1124 なんだけど、関数呼び出しの途中ではできないから....
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1125
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1126 # main(ac,av)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1127 # int ac;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1128 .align 2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1129 .globl main
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1130 main:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1131 .type main,@function
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1132 pushl %ebp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1133 movl %esp,%ebp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1134 pushl %ebx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1135 pushl %ecx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1136 pushl %edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1137 # char *av[];
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1138 # {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1139 # register int i;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1140 # register char *p;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1141 # int j = 3;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1142 # struct { int b; void (*c)(struct aa); } q = {3,main1},r;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1143 #
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1144 # j = 3;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1145 subl $20,%esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1146
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1147 このsublを後から指定してやればOk。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1148
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1149 でも、それだと jump の時にずれない? ずれるか? ずれるね。うーん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1150 実行時にチェックしてやるのも変だし。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1151
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1152 まぁ、それほど必要な機能ではないんだけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1153
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1154 これもcontinuationを渡してやると言う手法が使えないことはないんだが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1155
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1156 関数呼び出しの最初にやってやればいいか。それでできるかな?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1157
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1158
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1159 Sun Feb 20 23:59:16 JST 2000
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1160
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1161 MIPS のcall frame
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1162
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1163 $sp = $fp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1164 local variables
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1165 saved register (including $31 = return address)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1166
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1167 mask は使用したレジスタのbit pattern
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1168 -4 は何?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1169
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1170 18 .mask 0xc0000000,-4
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1171 19 .fmask 0x00000000,0
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1172 20 0000 D0FFBD27 subu $sp,$sp,48
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1173 21 0004 2C00BFAF sw $31,44($sp)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1174 22 0008 2800BEAF sw $fp,40($sp)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1175 23 000c 0000000C move $fp,$sp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1176 24 0010 21F0A003 jal __main
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1177 25 0014 03000224 li $2,0x00000003 # 3
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1178 26 0018 000082AF sw $2,a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1179 27 001c 04000224 li $2,0x00000004 # 4
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1180 28 0020 00C082AF sw $2,b
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1181 29 0024 05000224 li $2,0x00000005 # 5
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1182 30 0028 000082A3 sb $2,c
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1183 31 002c 06000224 li $2,0x00000006 # 6
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1184 32 0030 08C082A3 sb $2,d
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1185 33 $L1:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1186 34 0034 21E8C003 move $sp,$fp # sp not trusted
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1187 here
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1188 35 0038 2C00BF8F lw $31,44($sp)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1189 36 003c 2800BE8F lw $fp,40($sp)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1190 37 0040 0800E003 addu $sp,$sp,48
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1191 38 0044 3000BD27 j $31
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1192 39 .end main
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1193
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1194 これと同じようにするならば、regiterの使用数を最初に調べる必要が
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1195 あるのだけど、one path compiler である micro-C では、それは
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1196 できない。したがって、enter は後ろでする方が良い。
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1197
59
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1198 Mon Jan 20 18:25:27 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1199
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1200 3年間さわってないのかよ。何やってんだ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1201
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1202 goto 文のバグをとらないといけない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1203
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1204 まず、関数引数の構造体の展開。これは、どうってことないはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1205
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1206 goto (*code)(i+1,j,...)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1207
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1208 まず、いじらなくてすむ変数を摘出する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1209
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1210 foreach arg
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1211 compare
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1212
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1213 単純演算 ( op+const , pointer , const assign ) などは、ここで検出する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1214 大半は、そのようになるはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1215 レジスタに乗せる分があるから... それには触らないとして...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1216
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1217 複雑なものは、前もって計算しておく。(get_register する)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1218 スタック上かレジスタ上に作る。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1219
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1220 残りは並列代入となる。再帰的に計算する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1221
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1222 えーと、大きな順にやるんだっけ? 小さな順にやるんだっけ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1223 code f( int a, int b, int c ) {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1224 goto g(b,c,a);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1225 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1226 みたいなやつだよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1227
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1228 移動するものを一つ検出する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1229 そのために移動が必要なものを移動しておく(再帰)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1230 代入する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1231
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1232 こんなんでいいのか? ループしない? するよね。ループしたら
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1233 get_register する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1234
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1235 前の例だと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1236
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1237 g(b,c,a) のbに着目する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1238 bに代入するコードを出すと、a が壊れる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1239 a が必要かどうかを調べる。それは、引数のリストを見ればわかる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1240 その前に、a を移動する。a の移動先を見て、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1241 空いていれば、移動してOk。しかし、c
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1242 なので、 c を見る。と b になるので、ループするのがわかるので、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1243 b を get_register する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1244 で、c が移動できる。で、aを移動して、とっておいたbを代入。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1245
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1246 Tue Jan 21 22:45:09 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1247
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1248 とりあえず、jump は複雑すぎる。もっと簡単にすることを考える。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1249 parser 側である程度処理できない?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1250
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1251 goto f(a+3,b(),c);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1252
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1253 などを、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1254
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1255 a = a+3;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1256 b = b();
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1257 goto f(a,b,c);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1258
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1259 程度に簡略化する。この時、f(a,b,c) は(できるだけ)、元の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1260 関数の引数リストに近付ける。のは無理なので、単純変数
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1261 まで落す。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1262
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1263 あまり関係ないか。一時変数はどうせいるわけだし。ってこと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1264 みたいね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1265
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1266 だとすると、元のコードと、そう変わらんね。前のも、そんなに
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1267 悪くないってことか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1268
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1269 Wed Jan 22 14:33:12 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1270
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1271 やっぱり、途中で局所変数を増やしたいよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1272
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1273 Fri Jan 31 20:30:36 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1274
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1275 なんか #ifdef / #if がないとだめだな。実装する?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1276 しました。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1277
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1278 Tue Feb 4 01:04:12 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1279
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1280 ## while ((*chptr++ = c = getc(filep->fcb)) != '\n') {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1281 _1120:
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1282 movl $10,%eax
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1283 movl $8,%ecx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1284 movl filep,%edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1285 addl %ecx,%edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1286 movl (%edx),%edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1287 pushl %edx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1288 xchg %edx,%eax .... edx に$10が入る (なんでxchg?)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1289 call getc
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1290 addl $4,%esp
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1291 movl %eax,-20(%ebp) c に代入
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1292 movl $chptr,%ecx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1293 pushl %ecx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1294 popl %ebx
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1295 movl (%ebx),%ecx ecx にchptrの中身
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1296 addl $1,(%ebx)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1297 movb %al,(%ecx)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1298 subl %edx,%eax eax-edx ($10)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1299 je _1119
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1300
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1301 が壊れる理由なんだけど...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1302
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1303 edx,ecx が破壊されちゃうみたいね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1304
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1305 Tue Feb 4 12:17:07 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1306
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1307 ようやっと直したよ...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1308
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1309 use_pointer って、なにもしなくていいんだよね? eax,ebx を避ける
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1310 ってことらしいけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1311
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1312 inline/引数付き #define 欲しくない? 置き換えは、local name stack に積んじゃう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1313 展開は function で行う。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1314
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1315 getch を工夫する必要はあるが。置き換えスタックが必要。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1316
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1317
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1318 Wed Feb 5 01:16:00 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1319
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1320 大域で定義された struct field が大域変数と重なっていると落ちる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1321 そりゃそうだけど。どうするの? (直した記憶があるんだけどなぁ...)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1322 struct 毎に field 名とoffset/type の組を持てばい良いんだよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1323
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1324 なんだけど、タグ無しの構造体もあるから、型名の方に付ける必要
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1325 もある。というのは、型名のない構造体もあるから。タグ名には、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1326 一応、リストがついている。なんかに使う必要があったんでしょう
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1327 ね。あ、めんどう。無条件にやっても大域変数名を汚すのを直すの
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1328 が難しい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1329
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1330 ちょっと、あれだけど、「型名.フィールド名」で登録してしまうのはどう?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1331 型名が後で出て来るところが気まずいが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1332
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1333 def で登録するときに、nptrにdispを代入せずに、struct field list
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1334 (大域変数) に入れて、type の方に、field list (list3(nptr,offset,
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1335 type)) を入れれば良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1336
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1337 あとは、strop の方でtypeのlistを見るようにすれば良いわけだ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1338
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1339 これなら、簡単に直せるはず。LUSTR/GUSTRなどの区別もなくなるし。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1340
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1341 Wed Feb 5 02:10:14 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1342
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1343 浮動小数点ねぇ。完全なANSI Cにするのは大変。でも、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1344 浮動小数点ぐらいないと。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1345
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1346 code generation part を、さらに分割して、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1347 複数のコード対応にしやすいようにする。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1348 おそらく、それほど共有する部分はないけどね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1349
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1350 Sample C code をコンパイルして、その結果から(半分手動で)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1351 Micro CbC code generation part を生成する方法を用意する。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1352
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1353
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1354
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1355 Thu Feb 6 11:47:03 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1356
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1357 Code Segement を単位として使うときに、大域変数はどういう
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1358 ように分けるの? static なんかは意味ないよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1359
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1360 もちろん、自然にグループ分けされるわけだけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1361
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1362 あとデータフローだよね。データフローに関しては、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1363 あんまりやってないなぁ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1364
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1365 Fri Feb 7 14:36:15 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1366
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1367 inline では、必らず、局所変数の増加がある。また、inline
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1368 は普通の関数として展開しておく必要もあるらしい。(何故?)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1369
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1370 #define ねぇ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1371
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1372 #define c(a,b) g(a+1,b+1)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1373 #define g(a,b) printf("%d %d\n",a+1,b+1);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1374
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1375 main() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1376 int a,b;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1377 a =1; b = 3;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1378 c(a,b);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1379 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1380
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1381 local #define がいるんだよね。g の中で a が出て来た時には、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1382 c のa の置き換えは起こってはいけない。ということは、c
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1383 の置き換えはg が始まる前に終っている必要がある。dynamic
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1384 scope なんだから、assoc の上乗せで良いはず。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1385 macro のlevelを定義して、あるレベルでは、それ以前の展開
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1386 を行わないという手法が良いかな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1387
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1388 c(a,b) => a=>"a+1", b=>"b+1"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1389 g(a,b) => (a=>"a+1+1",a=>"a+1"), (b=>"b+1+1",a=>"a+1")
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1390
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1391 みたいな感じ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1392
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1393 やっぱり関数解析でマクロ処理をやらせるのは無理かな? 先読みされちゃうし。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1394
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1395 Sat Feb 8 00:53:52 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1396
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1397 macro は途中まで書きました。置き換えをマクロが呼び出された
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1398 時点で cheap に置くと、それを解消するタイミングがない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1399 ここだけmallocしても良いが..
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1400
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1401 chptrsave はlistにする必要がある。list で良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1402
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1403 やっぱりmacro levelを見て、自分と一致したassoc valueまで
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1404 手繰って置換するんでしょう。そうすれば、置き換える必要は無い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1405 ということは、local_define にmflagsを格納する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1406
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1407 c(a,b) => a=>"a", b=>"b"
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1408 a=>"a" .. mflag == 1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1409 g(a,b) => (a=>"a+1+1",a=>"a+1"), (b=>"b+1+1",a=>"a+1")
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1410 a=>"a+1" .. mflag == 2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1411
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1412 macro のもとのnptr が残ってないと、オリジナルを返せない。オ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1413 リジナルは、sc などが破壊されてしまう。ってことは、local macro
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1414 は、local table を汚してはいけないってことだよね。ってことは、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1415 macro table は、もとのとは別に用意する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1416
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1417 #define c(a,b) g(a+1,b+1)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1418 #define g(a,b) printf("%d %d\n",a+2,b+2);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1419
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1420 main() {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1421 int a,b; a ... local
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1422 a =1; b = 3;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1423 #ifndef a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1424 c(a, a = "a".. macro mflag==1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1425 g(a,
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1426 a="a+1" mflag==2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1427 ^ a = "a" mflag==1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1428 While replacing a in g's body, a should not
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1429 be replaced to (original) "a", should be c's a.
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1430 b);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1431 /* 3,5 expected */
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1432 #endif
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1433 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1434
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1435 うーむ。ややこしい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1436
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1437 main()
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1438 c(a,b) mflag++
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1439 a=>"a" mflag ==1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1440 g(a,b) mflag++;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1441 a=>"a+1" mflag ==2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1442 ^ is replaced by c's "a" not g's a;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1443 いったん mflag level n で展開したら、それは mflag level n-1 となる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1444
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1445 Sat Feb 8 18:13:43 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1446
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1447 いちおう、mflag まではデバッグしたが.... mflag を戻してないんじゃないの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1448
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1449 ---c(a,b)----------------------- mflag ==1
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1450 a=>hoge, b=>hoga (mflag==1)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1451 ----g(ac,bc)----------------- mflag ==2
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1452 ac=>goge, bc=>goga(mflag==2)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1453 ----printf(a,b)---------- mflag ==3
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1454 a=>poge, b=>poga(mflag==3)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1455
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1456 g が呼び出されると、ac,bc は mflag==1 でのみ置換される。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1457
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1458 あるテキストを置き換えると、それは置き換えたマクロのmflag level
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1459 (つまり一つ少ないレベル)になる。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1460 置き換え終ったら、元のlevelに戻す。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1461
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1462 mflag==2のlevel では、mflag==2のlocal macroの展開しかしない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1463
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1464 置き換えると、mflag level 1 になるので、そこで mflag==1 のlocal
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1465 macro を展開する。mflag==0 は常に展開を行う。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1466
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1467 Sun Feb 9 11:35:23 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1468
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1469 うーん、なんかtypeが、list とCHARなどと入混じっているじゃん。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1470 int save = chptrsave;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1471 で、chptrsave が、$chptrsave になってしまう。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1472
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1473 Sun Feb 9 22:33:36 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1474
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1475
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1476 #define car(e) (heap[(int)(e)])
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1477 #define cadr(e) (heap[((int)(e))+1])
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1478 car(cadr(e))
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1479
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1480 だろ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1481 car ->
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1482 #define e cadr(e) (mleve=1)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1483 cadr ->
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1484 #define e e (mleve=2)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1485
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1486 むぅ。これ、うまくいかないんじゃん。こまったなぁ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1487
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1488 #define c(a,b) g(a+1,b+1)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1489 #define g(a,b) printf("%d %d\n",a+1,b+1);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1490 c(a, b);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1491
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1492 こっちもだめじゃん。ふーむ。lisp interpreter のように
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1493 作ればいいはずなんだけど。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1494
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1495 Mon Feb 10 08:10:25 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1496
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1497 結局、list base のinterpreter を実装しました。きちゃないが。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1498 前の方法でも、頑張ればできるんでしょうけどね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1499
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1500 Tue Feb 11 13:50:03 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1501
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1502 struct copy だけど... 関数がstructを返すときに、引数に前もって
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1503 積んでおくのでは、そこに値がコピーされてしまうし、あとで、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1504 スタックをたたんで置くときにきまずい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1505
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1506 function call の時に、引数の型のチェックをしてない
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1507
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1508 type に -1 とheapの引数が混在しているやつだけど..
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1509 やっぱまずいんじゃないか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1510
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1511 temproal struct は再利用できるんだけど、dispの変更ができないので
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1512 新しく作るしかない。大きいときだけ新しく作るなんていうセコイ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1513 技はあるけど。(そうすると、帰って来た値へのポインタを使えなく
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1514 なるが.... 別にいいよね。戻り値それ自身を直接 return する
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1515 時もだいじょうぶなはず)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1516
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1517 結局、呼出側で、領域を確保して引き渡すことにしました。この方法だと、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1518 代入のときに二度コピーする必要もない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1519
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1520 register を使用しているかだけじゃなくて、実際にcreg/dregに
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1521 値があるかどうかを記憶する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1522
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1523 Wed Feb 12 11:09:22 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1524
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1525 それだけどさ... やっぱりアドホックに実現するのは難しいんじゃないの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1526
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1527 まぁねぇ。register の場所の確保と、寿命は別だから、それで
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1528 いいんだけど、regs flag だけでなんとかならないのかな。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1529 こういう変更ははまるが虚しい。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1530
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1531 Thu Feb 13 18:37:36 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1532
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1533 さて、そろそろ jump にとりかかりますか。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1534
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1535 構造体の引き渡しのシークエンスに使う局所変数の位置がgccと違う...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1536
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1537 そろそろ register は構造体にすべきだね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1538 struct register {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1539 int used;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1540 int valued;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1541 char *name;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1542 char *wname;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1543 char *bname;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1544 int type; /* register variable or not */
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1545 int number;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1546 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1547 virtual/real は、どうする。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1548
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1549 Sat Feb 15 14:00:03 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1550
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1551 fdecl_struct を構文的に引数が出現するときに行うと、int *f(int
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1552 a) などで、* の評価が終る前に、int aが評価されしまう。*obj
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1553 のobj を評価し終らないとfのタイプが確定しない。int*f()[] み
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1554 たいな場合があるから。(?) なので、gcc と、そろえるためには、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1555 arg の先頭で fdecl_struct を行う方法ではだめで、fdecl 中であ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1556 とから修正する方が良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1557
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1558 fix しようにも引数リストなんて、存在しないじゃん!
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1559
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1560 varargs を実装するのはめんどくさかろう...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1561
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1562 rvalue(expr(),type) では、expr() のtypeをrvalueに引き渡せな
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1563 い。でも、type を大域変数にすると、rvalueを異なるタイプで呼
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1564 び出すときにtypeを変更する必要がある。このrvalueのtype の扱
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1565 いは、かなりはまったことがあるので、rvalue(int e,int type)の
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1566 方が良いことは確かなんだが...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1567
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1568 struct_push のregisterの扱いが複雑すぎ。なんか、もっと
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1569 簡単にならないの?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1570
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1571 Sun Feb 16 07:58:23 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1572
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1573 代入しなくて良いからと言って、ソース
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1574 のリストから除いては、上書きを防げない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1575
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1576 Sun Feb 16 22:55:58 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1577
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1578 vdisp ってなんだったんだ?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1579
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1580 Mon Feb 17 12:35:39 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1581
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1582 並列代入は出来たみたい。代入は小さいものを先にすべきなのか?
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1583 まぁ、できりゃいいんだけど、横に避けるものが大きいのはいや
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1584 だよね。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1585
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1586 Tue Feb 18 11:56:10 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1587
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1588 overraped 用の emit_copy
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1589 float/double
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1590 long long
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1591
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1592 Tue Feb 18 19:34:31 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1593
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1594 code argument の符号を反転させると、list2(LVAR,offset)
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1595 のoffsetがアドレスの方向と一致しているという前提が
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1596 崩れる。それで、構造体の格納順序がずれてしまう...
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1597
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1598 ということは... def(n) でcodeの時はargumentは、局所変数と同じ
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1599 扱いでマイナス符号で処理した方が良い。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1600
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1601 できたみたい。でもさ、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1602
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1603 int main( int ac, char *av[])
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1604 {
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1605 int n;
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1606 goto arg1(0,1,2,3,4,return,environment);
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1607 }
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1608
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1609 って、きっと return 文がないと、文句を
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1610 言われるよね。むむむ。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1611
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1612 post processing する時にoverrapしてないという保証がない。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1613
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1614 Wed Feb 19 15:38:55 JST 2003
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1615
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1616 自分自身とのoverrrapを見てないので、
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1617 struct a a,int i
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1618 int i,struct a a
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1619 みたいな時に自分自身を壊してしまう。なので、emit_copy
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1620 が、ちゃんと方向を見て壊さないように処理する必要がある。
eeca07d1b1c2 *** empty log message ***
kono
parents:
diff changeset
1621
75
92dcf107a837 c code output
kono
parents: 73
diff changeset
1622 call bcopy でいいじゃん。まね。
64
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1623
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1624 Wed Feb 19 20:42:07 JST 2003
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1625
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1626 楊さんの C2CbC と CbC2C を、micro C に取り込む。各所に、
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1627 conv->func(); を埋め込む。conv は、構造体。
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1628
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1629 conv: original
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1630 c2cbc
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1631 cbc2c
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1632
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1633 とする。なるほど。
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1634
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1635 Thu Feb 20 05:34:58 JST 2003
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1636
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1637 むぅ。code-ia32 で結構はまった。あと、stack のアライメントが
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1638 ずれるみたい。6809では問題にならなかったんだけどね。
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1639 leave で調整するべき。
262c8059e5df *** empty log message ***
kono
parents: 59
diff changeset
1640
66
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1641
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1642 Thu Feb 20 14:42:46 JST 2003
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1643
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1644 c2cbc,cbc2c なんだけど、いったん、構文木にしてから変換すると、
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1645 結構失われる情報があるけど、いいの? 特に局所変数の名前とか型
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1646 の情報とか。macro もそうだけど。 indent ぐらい保存できないか
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1647 なぁ。式の途中でfunction callする場合も取り扱う必要があるの
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1648 で、構文木にしてから計算するしかないかな。gexpr の代わりに生
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1649 成するようにするか。そうすると、修正するのは、statement と、
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1650 gexpr になる。でも、結局、構文木で型を持ち歩くしかないんじゃ
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1651 ないの? やっぱり変だよ。型の情報がないのは。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1652
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1653 そうではなくて、exprN() で変換していく方法もある。この方が
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1654 情報が欠落しないので楽だろう。そうすると、修正するのは、
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1655 exprN(),doXXXX()
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1656 となる。これは、量は多い。けど、まぁ、それだけ。この方が
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1657 オリジナルを保存しやすい。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1658
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1659 中間変数を途中で追加すると、宣言部を前もって出力できなく
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1660 なる。{int a;...} を認めれば良いわけだど。実装は難しくない。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1661 じゃ、やれば? でも、汚くなるなあ。出力をいったんバッファ
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1662 に貯めれば? どこに? cheapp ですか? 中間変数はいらないん
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1663 じゃないの?
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1664 a = g(i)+a;
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1665 でしょ。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1666 goto g_1(i,f_1,save_a); }
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1667 code g_1(i,f_1,save_a) { .... goto f_1(ret_value,save_a); }
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1668 code f_1(ret_value,save_a) { a = ret_value+a; ...}
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1669 じゃん。いらないじゃん。。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1670
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1671
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1672 型を表示するルーチンが必要だね。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1673
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1674 めんどくさいなぁ。CbCのProlog version とかほしいなぁ。そうすれば、
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1675 変換は簡単。でも、やろうとしてできなかったことでもあるな。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1676
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1677
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1678 Thu Feb 20 21:13:23 JST 2003
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1679
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1680 MC6809 の mc-codegen.c version は? (ちょっと虚しすぎる?)
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1681 X と D で、use_data_register, use_pointer してやる。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1682 tosop で、X と D の間の足し算を特別扱いする。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1683 (なるほど...) MAX_MAX=0でうまく動くのか? やっぱり、1は
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1684 いるよね。できれば、2だよね。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1685
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1686 結構、浮動小数点も簡単かも。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1687
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1688 汎用の書き換えツールも便利そう。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1689
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1690 でも、Prolog version ってのも面白そう。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1691 code(name,interface(....)) :-
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1692 p()....,goto(name,interface(....)).
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1693 みたいな感じ? 結構、簡単にinterpreterを書けるかも知れない。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1694 これは、あれだね。thread diagram interpreter と似ている。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1695
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1696 Fri Feb 21 13:34:17 JST 2003
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1697
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1698 構文要素での書き換えだけど、どれくらいの能力があるの?
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1699 その場での書き換えだけだと、ちょっと低すぎない? それで、
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1700 cbc2c,c2cbc はできるとは思う。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1701
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1702 まぁいいけど.. chk を無視しているところが結構あるんですけど。
0b068058dd67 *** empty log message ***
kono
parents: 64
diff changeset
1703 jmp,enter,leave ...
67
254a0c576114 argument type list
kono
parents: 66
diff changeset
1704
254a0c576114 argument type list
kono
parents: 66
diff changeset
1705 Sat Feb 22 13:05:04 JST 2003
254a0c576114 argument type list
kono
parents: 66
diff changeset
1706
254a0c576114 argument type list
kono
parents: 66
diff changeset
1707 type の印刷かぁ...
254a0c576114 argument type list
kono
parents: 66
diff changeset
1708
254a0c576114 argument type list
kono
parents: 66
diff changeset
1709 conv 系は大半はdefault convが呼ばれる。なので、c.c
254a0c576114 argument type list
kono
parents: 66
diff changeset
1710 っていうよりは、default.cだよね。必要なところだけ、
254a0c576114 argument type list
kono
parents: 66
diff changeset
1711 自分で代入すると言う方法が良いだろう。その方が
254a0c576114 argument type list
kono
parents: 66
diff changeset
1712 ヘッダも一つで済むし。もちろん、object 指向なら
254a0c576114 argument type list
kono
parents: 66
diff changeset
1713 簡単なんだが...
254a0c576114 argument type list
kono
parents: 66
diff changeset
1714
254a0c576114 argument type list
kono
parents: 66
diff changeset
1715
254a0c576114 argument type list
kono
parents: 66
diff changeset
1716 Sun Feb 23 19:47:41 JST 2003
254a0c576114 argument type list
kono
parents: 66
diff changeset
1717
254a0c576114 argument type list
kono
parents: 66
diff changeset
1718 struct のtypeを印刷するんだけど、一回印刷したら、あとは印刷
254a0c576114 argument type list
kono
parents: 66
diff changeset
1719 しない方が良い。逆に毎回書くなら、tag名type名は、いらないの
254a0c576114 argument type list
kono
parents: 66
diff changeset
1720 か。
254a0c576114 argument type list
kono
parents: 66
diff changeset
1721
254a0c576114 argument type list
kono
parents: 66
diff changeset
1722 とするとtypeの解釈はやめてndeclで処理する? 印刷では、それで
254a0c576114 argument type list
kono
parents: 66
diff changeset
1723 いいわけだけど。
254a0c576114 argument type list
kono
parents: 66
diff changeset
1724
254a0c576114 argument type list
kono
parents: 66
diff changeset
1725 このタイプの印刷だと再帰型は印刷が終了しないんじゃないか?
254a0c576114 argument type list
kono
parents: 66
diff changeset
1726 しないね。
69
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1727
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1728 Mon Feb 24 02:31:06 JST 2003
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1729
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1730 strings の\nなどを元に戻す必要がある。
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1731
dba8d111b7a0 c output
kono
parents: 67
diff changeset
1732 なんか括弧がわやになってるな。
70
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1733
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1734 Mon Feb 24 11:02:07 JST 2003
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1735
73
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1736 typedef されたタイプは、そちらを使う方が良い。けど、情報が失
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1737 われてしまっているので、どこかにとっておかないとだめだね。dsp
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1738 ?
70
2e84590720a6 typedef name
kono
parents: 69
diff changeset
1739
73
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1740 うーむ、これはなかなか難しい。全サーチしてもいいんじゃないか
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1741 な。遅いけど。少なくともgnptrで定義されたものはサーチすべき
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1742 でしょう。
72
3b5d293cea36 type def etc
kono
parents: 70
diff changeset
1743
3b5d293cea36 type def etc
kono
parents: 70
diff changeset
1744 indirect function type の表現がなぁ....
3b5d293cea36 type def etc
kono
parents: 70
diff changeset
1745
73
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1746 sdecl ではconv を行うので、type_print ではsdeclを経由した場
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1747 合に表示を行ってはいけない。
72
3b5d293cea36 type def etc
kono
parents: 70
diff changeset
1748
73
2f613f0ef130 *** empty log message ***
kono
parents: 72
diff changeset
1749 なんか関数の引数の型の値が微妙に変わるんですけど... やだなぁ...
75
92dcf107a837 c code output
kono
parents: 73
diff changeset
1750
92dcf107a837 c code output
kono
parents: 73
diff changeset
1751 まだ、関数定義のtypedefがstructに変わってしまう。gtypedefed
92dcf107a837 c code output
kono
parents: 73
diff changeset
1752 がうまく動いていない?
92dcf107a837 c code output
kono
parents: 73
diff changeset
1753
92dcf107a837 c code output
kono
parents: 73
diff changeset
1754 Mon Feb 24 17:24:31 JST 2003
92dcf107a837 c code output
kono
parents: 73
diff changeset
1755
92dcf107a837 c code output
kono
parents: 73
diff changeset
1756 まぁねぇ。やっぱり完全に構文木から再構成した方が
92dcf107a837 c code output
kono
parents: 73
diff changeset
1757 便利ではあるよね。特に getsym (空白など)と conv->x_()
92dcf107a837 c code output
kono
parents: 73
diff changeset
1758 との総合作用はめんどくさい。
92dcf107a837 c code output
kono
parents: 73
diff changeset
1759
92dcf107a837 c code output
kono
parents: 73
diff changeset
1760 そのためには、局所変数名をtree上で持ち歩く必要がある。
92dcf107a837 c code output
kono
parents: 73
diff changeset
1761 まぁ、そうすれば良いだけだけど。
92dcf107a837 c code output
kono
parents: 73
diff changeset
1762
92dcf107a837 c code output
kono
parents: 73
diff changeset
1763 実際、今のセットで出来るかどうかは、ちょっと怪しい。
92dcf107a837 c code output
kono
parents: 73
diff changeset
1764 たぶん、buffer に出力するってのをいれればおそらくは
92dcf107a837 c code output
kono
parents: 73
diff changeset
1765 変換できるだろう。
92dcf107a837 c code output
kono
parents: 73
diff changeset
1766
76
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1767 式の途中での呼び出しとかを考えると、やっぱり
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1768 構文式から生成しないとだめだろうね。
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1769 (ってことは、まだ、かなりの作業があるってこと.... むぅ...)
fb3fb9e9a462 *** empty log message ***
kono
parents: 75
diff changeset
1770 tmp2.c は、通らないし...
78
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1771
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1772 Fri Feb 28 20:32:46 JST 2003
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1773
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1774 で、c2cbc は、途中で float の方を先にやるわけ?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1775
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1776 Sat Mar 1 22:05:43 JST 2003
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1777
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1778 creg_destroy は、ぜんぜんだめ。これは基本的なアイデアがだめ。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1779
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1780 long long はstructでいいんじゃない? だめ? で struct 演算を別に
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1781 定義してやる。これは、実装にもよるか。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1782
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1783 float,long longなんだけど、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1784 FRGVAR DRGVAR LRGVAR
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1785 などを作る。さらに、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1786 FMUL DMUL LMUL
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1787 などもいる。型の変換は binop で解釈する。変換も演算になる。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1788 D2F, D2I, F2D, F2I, I2D, I2F, U2D, U2F
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1789 ぐらいですか?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1790
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1791 emit_pushは、型を必要とするけど? そうだねぇ。emit_fpush, emit_dpush
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1792 かな?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1793
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1794 creg にfloat register(or stack) の値を入れればいいんじゃないの?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1795 それを見て、emit_pushの型を決める。creg は、けっこう、いろんあ
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1796 ものが見ているので、いじらない方がいいじゃないかなぁ。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1797 そうね。FMULとかがあるなら、それで判断できそう。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1798
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1799 構文木には型を含めないってのは不便。型を入れれば? そうすれば、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1800 RGVAR CRGVAR FRGVAR DRGVAR LRGVAR
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1801 ではなく、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1802 RGVAR
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1803 ですむし。その方が変形も楽だしね。型は、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1804 CHAR,UNSIGNED, UNSIGNED CHAR, INT, FLOAT, DOUBLE, LONGLONG
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1805 ぐらいですか。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1806
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1807 emit_data
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1808
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1809 とすると、書き換えが結構あるけど。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1810
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1811 Sun Mar 2 12:58:38 JST 2003
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1812
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1813 あとはconstantだね。FCONT,DCONSTかな。binopでは
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1814 変換とかも必要なわけだけど。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1815
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1816 そういえば、shot のload/storeもないね。SRGVAR,SASSとかですか? SASS
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1817 は、すでにあるなぁ。
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1818
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1819 Sun Mar 2 22:01:58 JST 2003
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1820
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1821 あれ?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1822 conv->_sm();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1823 (*conv->_sm)();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1824 の場合は、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1825 *conv->_sm の値へcallする
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1826 んだけど、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1827 goto exit1();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1828 goto (*exit1)();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1829 の場合は、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1830 exit1
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1831 の値へjumpするんだよね? およ? なんか勘違いしてる? なんでexit1()
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1832 だとindirectが出て、(*exit1)だと出ないんだろう?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1833
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1834 この宣言は、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1835 void (*_sm)();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1836 であって、
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1837 void _sm();
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1838 はできない? なんで?
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1839
8418d4b7caa7 *** empty log message ***
kono
parents: 76
diff changeset
1840 あぁ、まぁ、いろいろ、めんどくさい。
79
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1841
82d0e30f61dd *** empty log message ***
kono
parents: 78
diff changeset
1842 やっぱり、arglist の再帰的扱いがちゃんとしてないとだめ。
81
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1843
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1844 うーむ、 enum なんてのもあるのね。やさしいけど、いるのか?
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1845
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1846 code (code *) * みたいなのがあるので、conv は手直しが必要。
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1847
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1848 Mon Mar 3 12:38:08 JST 2003
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1849
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1850 float/duble は順調に進んでるけど、3日はかかるでしょう。
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1851
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1852 binop を書いちゃうとmc-parse.c は、ほとんど終り?!
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1853 代入と関数呼び出しが残っているか。あと single もあるね。
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1854
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1855 emit_push base で書くんだけど、他のCPUではだいぶ様相が
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1856 違うんだろうな。
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1857
f94ca1168520 float first try...
kono
parents: 79
diff changeset
1858 dreg/creg のfloating versionが必要です。( です? )
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1859
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1860 Tue Mar 4 14:56:28 JST 2003
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1861
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1862 double のcurrent register は387のスタックを使う。(?)
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1863 関数呼び出し時に387のスタックが保存されるという
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1864 保証は無いので、emit_dpushでは、%esp に保存する。
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1865
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1866 でも、そうすると、代入の後などで387のスタックが
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1867 常に残ることになる。こいつをクリアするコードは
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1868 どこにいれる? free_register でもいいんだけど....
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1869 ううーむ、つかいずらいやつ。ld じゃなくて、
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1870 stack top に代入するオペレーションはないの?
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1871
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1872 (あぁ、でも、なんか、floatは、もうすぐ終っちゃうな... なんか、
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1873 さびし...)
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1874
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1875 Tue Mar 4 23:58:07 JST 2003
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1876
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1877 fmulp とかでは、fpp のstackのつじつまはあう。fstl とかだと、
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1878 合わない。fstpl すればいいんだが、そうすると連続代入でまずくなる。
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1879 値を使うかどうかを代入時に知ることができれば良いんだが。
85
3789aef7331d minor fix
kono
parents: 82
diff changeset
1880 (use flag で判断することにした)
82
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1881
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1882 結局、freg は、使わなかったね。0が、入っているので直さないとまずいか。
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1883 fregを見て、stack を直すってのは、やっぱり、まずいよな...
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1884
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1885 でも、浮動小数点レジスタを持つCPUの場合はいるんじゃないの?
25654dc29ecc First Floating Point coding done.
kono
parents: 81
diff changeset
1886
85
3789aef7331d minor fix
kono
parents: 82
diff changeset
1887 Wed Mar 5 11:25:11 JST 2003
3789aef7331d minor fix
kono
parents: 82
diff changeset
1888
3789aef7331d minor fix
kono
parents: 82
diff changeset
1889 printf では 引数はdoubleで統一する必要がある。goto() では、
3789aef7331d minor fix
kono
parents: 82
diff changeset
1890 それをするのはまずい。局所変数と同等だから。ってことは、
3789aef7331d minor fix
kono
parents: 82
diff changeset
1891
3789aef7331d minor fix
kono
parents: 82
diff changeset
1892 関数の引数はdoubleにしないとだめなのね。プロトタイプが
3789aef7331d minor fix
kono
parents: 82
diff changeset
1893 ある時は、その限りでない。(うーむ...)
3789aef7331d minor fix
kono
parents: 82
diff changeset
1894
87
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1895 (くそ、こいつの副作用が結構出るな...)
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1896
85
3789aef7331d minor fix
kono
parents: 82
diff changeset
1897 あと、fpp のスタックに頼っているので、overflowした時に
3789aef7331d minor fix
kono
parents: 82
diff changeset
1898 困らないか? ほとんどの場合でだいじょうぶだが、だめだった
3789aef7331d minor fix
kono
parents: 82
diff changeset
1899 時にerrorぐらい出せば? でも実行時にしかわからないか...
3789aef7331d minor fix
kono
parents: 82
diff changeset
1900
3789aef7331d minor fix
kono
parents: 82
diff changeset
1901 I2D でさ、singned/unsigned の区別がいるね。
3789aef7331d minor fix
kono
parents: 82
diff changeset
1902
3789aef7331d minor fix
kono
parents: 82
diff changeset
1903 やっぱり FCONST いるんじゃないの?
87
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1904
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1905 Wed Mar 5 19:51:59 JST 2003
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1906
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1907 副作用以外は終ったけど.... あと、name space が結構重なっている
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1908 んだよね。
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1909 struct tag, struct field
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1910 が重なっているのは結構うっとうしい。gsearc/lsearch のあたりも
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1911 書き直さないとだめかも。
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1912
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1913 あと、list もなぁ。mode の作り方にもよるんでしょうけど。
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1914
1738f313f98b floating point (at most) done.
kono
parents: 85
diff changeset
1915 あと、結構、汚いよな...
88
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1916
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1917 Wed Mar 5 21:15:34 JST 2003
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1918
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1919 できたよ。まだ、テストしてない部分はあるけど。局所変数の初期化とか。
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1920 FCONST とか。3日で出来たね。
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1921
5c8553d7f984 *** empty log message ***
kono
parents: 87
diff changeset
1922 (gcc の方をやった方がいいかなぁ...)
89
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1923 goto.c が通らなくなってるな。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1924
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1925 Thu Mar 6 14:00:13 JST 2003
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1926
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1927 PowerPCのnon-lazy pointerって、テーブルに入っていてそれを読
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1928 み込む形式なのね。いったん、レジスタに読み込んだら、それを再
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1929 利用する形が良いらしい。ということは、code_gvar にキャッシュ
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1930 を作らないといけない。しかも RLU ですか? (めんどくさ〜)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1931 でも、そうしないと、
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1932 i = i+1;
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1933 なんてのでも、ひどい目にあってしまう。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1934
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1935 local variable も最初に move mutilple register で大半は
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1936 レジスタに読み込んじゃうみたいね。pointer で参照されると
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1937 困るんでしょうけど。まぁ、31個もあれば、そういうことを
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1938 してもあまり問題ないのかも知れないけど。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1939
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1940 creg を破壊しない実装にすれば、少しはましになるんじゃない?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1941 (IA32では、それは難しいけど)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1942
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1943 Thu Mar 6 20:50:24 JST 2003
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1944
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1945 やっぱり、使った分だけregisterを保存するようなコードに
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1946 なるみたい。one path で、それをするためには、
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1947 .align 2
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1948 _main0__:
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1949 lwz r5,2136(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1950 addi r1,r1,2128
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1951 lmw r23,-36(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1952 mtlr r5
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1953 blr
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1954 .align 2
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1955 .globl _main0
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1956 _main0:
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1957 mflr r2
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1958 stmw r30,-8(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1959 stw r2,8(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1960 li r11,0
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1961 stwu r1,-480(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1962 li r2,100
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1963 mtctr r2
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1964 mr r30,r3
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1965 addi r0,r1,64
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1966 mr r9,r0
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1967 b _main0__;
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1968 とかいう感じにするしかないね。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1969
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1970 あと引数は、レジスタに積むようになっているみたいだけど... r3 から?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1971
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1972 mflr r31
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1973 li r0,7
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1974 stw r0,56(r1)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1975
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1976 だから8個まではレジスタに積むみたいね。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1977 r3-r10 だね。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1978
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1979 構造体もregisterにコピーされるのか。そして、向う側で受取の
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1980 コピーを行うわけだね。先頭にreturn structへのポインタがあるのも
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1981 同じ。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1982
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1983 (うう、memcpyしまくりだ...)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1984
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1985 浮動小数点もレジスタ渡し見たい。f1から。(なるほど)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1986
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1987 saveFPってのを呼び出して、 f24-f31をsaveするらしい。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1988 (31-24)*8 数合わないな?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1989
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1990 pointer のことを考えると、レジスタだとまずいものもある
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1991 わけだけど。アドレスを取られてからで間に合うんじゃない?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1992 配列などは、もともとだめだし。場所と値(?)は確保するとして。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1993
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1994 そうか、逆に、r3-r10 は引数でなければ壊しても良いわけか。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1995 (それでr9とか良く使われているわけか...)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1996 ということは足りなくなったら、引数をセーブすれば良いわけね。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1997 (ってことは、LVAR かつ REGISTER っていう状況があるんじゃん...
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1998 まぁ、そうだけどさ...)
917947ffeb7c power pc version
kono
parents: 88
diff changeset
1999 これは get_register がめんどくさそ。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2000
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2001 どうも、r11-r12 あたりは自由に使っているらしい。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2002
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2003 引数を作っている途中で関数呼出しするときは、どうするの?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2004 r30などに移動するのか?
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2005
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2006 なんか知らんけど、in file call name と out file call name が
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2007 違うみたいね。(sigh...) こんなのなんとかなるのかなぁ。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2008 全部、stub にしておいて、.set で書き換えるという手もあるけど。
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2009
917947ffeb7c power pc version
kono
parents: 88
diff changeset
2010 (さすがに一日ではできないか...)
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2011
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2012 なんか整数から浮動小数点への変換はじぶんでやらないとだめなのね。
92
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2013 これはサブルーチンを呼んだ方がましだ。
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2014
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2015 get_register は絶対失敗しないようにできるんじゃないか?
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2016
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2017 label があると、code_base cache はclearしないといけない。
e7f8515ba882 *** empty log message ***
kono
parents: 90
diff changeset
2018 それを判断するには fwddef をhookする必要があるけど。
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2019
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2020 Fri Mar 7 09:17:10 JST 2003
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2021
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2022 問題は、
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2023 register allocation
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2024
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2025 function call/goto call
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2026 の構成だな。goto の方は machine dependentなところは
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2027 ほとんどない。register のsaveさえ必要ないから。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2028
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2029 register allocation だけど。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2030 r0
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2031 r1 frame pointer (or stack pointer )
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2032 r30 jj
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2033 r31 relocation register
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2034 r0,r1,r2 システムで使う
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2035 r0-r10 引数
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2036 引数でないところは優先的に使う
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2037 r20-r29 セーブして使う領域
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2038
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2039 r10-r19 はどうなんだろう? セーブしないのか?
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2040
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2041 ia32 の方でもfppのスタックを関数呼び出しのときに吐き出した方が
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2042 良い。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2043
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2044 r0 r1 r2 r3 r4 r5 r6 r7 r8 r9
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2045 r10 r11 r12 r13 r14 r15 r16
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2046 r28 r29 r30 r31
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2047
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2048 なので、もののみごとに、17-27 までが使われてないね。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2049
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2050 ということは、関す呼出し時には、保存されるレジスタはないと
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2051 思った方が良いってこと? あるいは、r17-r28 は保存されると
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2052 思って良いのかな。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2053
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2054 Sat Mar 8 19:28:42 JST 2003
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2055
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2056 関数呼び出し時のレジスタセーブを避けるためには、関数呼び出し
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2057 を優先して実行してやれば良い。関数呼び出しの結果は局所変数に
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2058 セーブする。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2059 f(g(h(a)+1)+2)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2060 は、
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2061 a1=h(a)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2062 a2=g(a1+1)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2063 f(a1+2)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2064 となる。そうすれば、関数呼び出しのときのスタックはかならず0になる。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2065
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2066 でも、結局、引数は関数呼び出しの前にセーブするのね。だったら、
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2067 そんなことしないで、セーブすれば良いのか。
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2068
94
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2069 Mon Mar 10 11:42:40 JST 2003
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2070
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2071 で、レジスタのセーブなんだけど、mc-codegen.c を変更しない
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2072 とすれば、引数のリストを使って変更していくのが良い。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2073 関数呼び出しは基本的には並列代入になる。並列代入でき
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2074 てもできなくても、セーブする必要はある。今の並列代入
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2075 ルーチンのできは良くないので、「同じかどうか」だけ
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2076 判断するのが良いのではないか?
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2077
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2078 関数呼び出しの前に式用にレジスタに積まれた値はセーブした
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2079 方が良い。セーブした後はlvarとしてアクセスすることになる。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2080 スタックでもいいけど。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2081 そうすると、stack 配列には、
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2082
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2083 レジスタ レジスタ番号 (>0)
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2084 スタック -1
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2085 lvar lvar番号
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2086
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2087 の三種類が入ることになる。それに合わせてtosop/assopを書き直
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2088 す必要がある。emit_pop だけでいいかも。スタックを止めちまう
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2089 のも手ではあるが、ia32の方で効率が悪い。やっぱり三種類サポー
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2090 トするのが良いだろう。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2091
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2092 (けっこういろいろあるなぁ... どこから手を付けるか...)
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2093
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2094 Tue Mar 11 14:23:57 JST 2003
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2095
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2096 save_stacks すると、レジスタはほとんど使われなくなって
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2097 しまう。が、コードの見通しは良くなる。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2098
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2099 定数を右辺に持って行くとsave_stacksでsaveする量が減る。が以
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2100 外にめんどくさいね。反射律が成り立たない演算子に関しては。tosop
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2101 の定数版とか作ることになるので... あとスタックに積む順序が逆
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2102 になってしまう。まぁ、もとの版では行われていたことだが...
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2103 CMPではrexpr で反転して論理を逆転させる方が簡単か。SUBでは、
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2104 ADD + (-CONST) にする方が良いね。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2105
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2106 je _xxx
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2107 したあと、current register のregv[]が残ってしまう。これは、
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2108 変だよね。gexpr_init で regv が残るのは、case 文の比較だけ。
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2109 あとは全部0にして良い。(まぁ、害は無いんだけど)
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2110
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2111 (case 文のjumpは、switch 文が終る時に処理すれば、index jump
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2112 にすることができるね)
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2113
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2114 Wed Mar 12 12:58:47 JST 2003
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2115
1ad7045741a7 float dbinop fix
kono
parents: 93
diff changeset
2116 比較で入れ換えるとの否定は若干違うよね。
96
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2117
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2118 Thu Mar 13 19:39:48 JST 2003
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2119
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2120 そういえば、doif で条件が定数だったときとかの最適化は
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2121 してないんだね。やさしいけど。chk を使えば良いので。
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2122
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2123 f(g(1,2,3),g(1,2,3),g(1,2,3))
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2124
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2125 とかだと、結局、g の返り値は一旦メモリに入れないとだめじゃん。
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2126 なんだけど、実際は、r29-r22 を使っているようですね。
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2127
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2128 ってことは、function call の時に、r3-r10 が前の引数かどうかを
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2129 チェックして、引数だったらr29-r22に移す作業がいるわけだよね。
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2130 いったんr3とかに入れてしまった後だと、重複してしまうが...
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2131 前もって関数呼出しがあるかどうかは、調べることができるから、
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2132 関数呼び出しがあったら、そうするようにする?
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2133
7d8de41390d8 *** empty log message ***
kono
parents: 94
diff changeset
2134 いろいろめんどくさいなぁ... (いったい、いつなったらできるんだ?)
98
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2135
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2136 Fri Mar 14 10:38:25 JST 2003
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2137
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2138 function の dsp が、arglist と extern flag の両方を入れてしまっている。
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2139 本来は sc で区別するべき物だよね。
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2140
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2141 なんか、emit_pop_free のxregがLVARの時のバグを取るのに苦労した...
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2142 gdb は top level でのwhile を受け付けなくて、define してやなんないと
07c2554e1cfa *** empty log message ***
kono
parents: 96
diff changeset
2143 だめみたいね。
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2144
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2145 Fri Mar 14 15:50:28 JST 2003
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2146
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2147 なぁ... 書いても書いても書いても、終らん!
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2148
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2149 Fri Mar 14 19:43:44 JST 2003
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2150
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2151 jump の中で input register を割り振るときに floating point register の
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2152 ことを考えてなかった。これは register_var とは異なるので異なる
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2153 仕組みで割り振る必要がある。ってことは、get_input_register_var
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2154 が要るってこと?
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2155
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2156
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2157 0x9001a544 <saveFP+4>: stfd f15,-136(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2158 0x9001a548 <saveFP+8>: stfd f16,-128(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2159 0x9001a54c <saveFP+12>: stfd f17,-120(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2160 0x9001a550 <saveFP+16>: stfd f18,-112(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2161 0x9001a554 <saveFP+20>: stfd f19,-104(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2162 0x9001a558 <saveFP+24>: stfd f20,-96(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2163 0x9001a55c <saveFP+28>: stfd f21,-88(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2164 0x9001a560 <saveFP+32>: stfd f22,-80(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2165 0x9001a564 <saveFP+36>: stfd f23,-72(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2166 0x9001a568 <saveFP+40>: stfd f24,-64(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2167 0x9001a56c <saveFP+44>: stfd f25,-56(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2168 0x9001a570 <saveFP+48>: stfd f26,-48(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2169 0x9001a574 <saveFP+52>: stfd f27,-40(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2170 0x9001a578 <saveFP+56>: stfd f28,-32(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2171 0x9001a57c <saveFP+60>: stfd f29,-24(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2172 0x9001a580 <saveFP+64>: stfd f30,-16(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2173 0x9001a584 <saveFP+68>: stfd f31,-8(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2174 0x9001a588 <saveFP+72>: stw r0,8(r1)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2175 0x9001a58c <saveFP+76>: blr
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2176
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2177 なのか。ということは、
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2178 f%d に対して、"saveFP+%d",68-(31-f)*4
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2179 かな?
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2180
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2181 うーん、これで、全部書いた気がする。でも、ほとんど全部の
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2182 関数にバグがあるだろうなぁ。一つ一つ取っていくしかないか。
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2183
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2184 Sat Mar 15 16:04:09 JST 2003
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2185
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2186 やぁ... まぁ.... バグだらけだな。
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2187
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2188 function call のレジスタの処理がでたらめ。RISCの場合は、parallel_assing
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2189 した方がいいんじゃないか?
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2190
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2191 Sun Mar 16 20:59:10 JST 2003
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2192
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2193 あぁ、まだまだ、かかりそうだ....
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2194
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2195 定義されてない関数/定数をextern扱いにする必要がある。(なんで、PICなの?)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2196
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2197 function は c0(n->ty)==FUNCTION で識別する。n->sc には、FUNCTION/EXTRN[1]
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2198 が入る。だよね。(CODE)も。だけど、n->ty に戻り型が入っている場合が
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2199 けっこうあるらしい。
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2200
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2201 (しかし、これは、結構かかるな...)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2202
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2203 Mon Mar 17 12:02:22 JST 2003
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2204
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2205 function のnptrだけど、
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2206 nptr->ty function の return type
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2207 list3(FUNCTION,return_type,arg_type_list);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2208 nptr->sc 本来はFUNCTION/CODE (EXTRN/EXTRN1)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2209 nptr->dsp 引数のリスト
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2210 と言う構成なわけだよね。で、引数のリストとtypeは重複している。
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2211
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2212 他のnptrとの整合性を考えると、
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2213 nptr->ty return type
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2214 nptr->sc FUNCTION/CODE
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2215 nptr->dsp 引数のリスト
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2216 が良い。で、引数のリストにEXTRNの情報を入れる方がいいんじゃないか?
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2217 (どっちにするんだよ...)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2218
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2219 プロトタイプと実際の引数リストの整合性はチェックしなくちゃ
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2220 いけないわけだから、別な方がいいんじゃないか? とすると、
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2221 やっぱり前者か...
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2222
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2223
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2224 extern と、そうでないものとの呼出しを、呼出しの時点で
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2225 区別しないといけない。しかし、prototype で定義されている
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2226 ものと default extern の区別は、最終の時点でしか判別できない。
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2227 できないよね。定義されてないものが default extern なんだから。
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2228 ってことは、最後に、.set で定義するしかないか。(sigh...)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2229
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2230 Mon Mar 17 14:34:12 JST 2003
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2231
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2232 えーと、input register に regv/regs をセットしないとだめ。
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2233 関数呼び出しの引数を評価する前に save する必要がある。
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2234 さらに、引数の評価の後に、save された変数を呼び出す必要が
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2235 ある。(ってことは、いままでのは、まったくのでたらめか..)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2236
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2237 register 変数の場合は、問題ない。ってことは、ia32 側も
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2238 変更してしまったので、おかしくなっているね。もっとも、
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2239 code の場合は、そういうsaveとかは必要ないから良いのか。
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2240
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2241 (11日目か...)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2242
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2243 mr creg,hoge
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2244 mr hoge2,creg
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2245
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2246 とかは、g_expr_u で最適化するべし。set_freg/set_creg でレジ
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2247 スタ変数に割り振ると、set_freg でfreeされてしまう。
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2248
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2249 浮動小数点定数の共有はやった方が良い?
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2250
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2251 input register のsaveを忘れている。
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2252 input register の割当が逆順。
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2253
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2254 Mon Mar 17 23:38:14 JST 2003
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2255
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2256 あぁ、そうか。input-register のアドレスを取ったときは、
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2257 それをLVARに変えないとだめ。
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2258
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2259 なんだけど、途中で分かっても、loop で前に戻ることがあるので、
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2260 手遅れです。ということは、one path ではできないね。
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2261
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2262 むぅ... function call の save_input_register も同じ「手遅れ」
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2263 の問題があるのね。function argument は、すでに parse されて
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2264 いて、その引数は、register に固定されてしまっている。
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2265 save_input_register で、save するコードを出しても、
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2266 そちらを見るようには出来てない。(どうすればいいんだ?)
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2267
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2268 function callの先頭で、引数を全部stackにsaveしてしまえば、
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2269 このあたりの問題は解決する。けど、あんまりな気もするね。
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2270 でも、stmw も使えるしな...
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2271
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2272 結局、input_register は、LVAR のまま処理して、可能ならば
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2273 register を使うって方がいいんじゃないかなぁ.... でも、
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2274 そうすると、今まで書いたコードは、ほとんど無駄かぁ...
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2275
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2276 いずれにせよ、あんまり簡単な解決はないね。
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2277
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2278 Tue Mar 18 10:46:48 JST 2003
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2279
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2280 結局、全部 stack にsave しました。そうすれば、変更は1行。
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2281
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2282 やっぱり、関数全体を構文木に落してからgexprするべきだよね。
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2283 それ自体は、そんなに難しくないが。
108
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2284
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2285 Tue Mar 18 12:41:42 JST 2003
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2286
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2287 COND(三項演算子)で使うレジスタが関数の引数を破壊してしまう。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2288 input register にならない値を使えば良いんだけど。r15
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2289 を使っているんだけど、それでいいの?
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2290
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2291 virtual を使っていたときは、use_register で何も破壊されなかった
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2292 んだけど、使わないとすると、結構破壊されてしまう。なので、
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2293 ちょっと奥の深い問題かもね。三項演算子の型はチェックしてなかったし。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2294
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2295 まぁ、それは、一時レジスタを使えば良いとして...
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2296
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2297 時々呼び出す、u2d とか bcopy とかで破壊されるinput レジスタ
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2298 はどうする? これは、予測は困難だよね。使う分だけsaveするって
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2299 言う手もあるけど。うー、どうしよう... 検出できるようにするっ
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2300 ていう手もある。(と、思ったら、get_register_var が間違ってい
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2301 るみたいね) 検出はちょっと重いか。二乗のアルゴリズムは、あま
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2302 り使いたくない。といっても、定数乗になるだけか。呼出側でsave
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2303 する? bcopy がどれくらい使うか割りと曖昧。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2304
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2305 もっと積極的にget_register_var するっていう手もあるよね。そ
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2306 うすれば、あまり気にすること無く library call できる。(ちょ
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2307 っと、書き換えが多いが...) その方が筋かな。使うレジスタを減
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2308 らそうと思うと、それは検出するのと、それほど差はないわけか。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2309
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2310 このあたりも構文木を全部持っていれば解決できるんだよな。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2311
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2312 うーん、まだまだ、だな。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2313
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2314 関数が関数呼び出しで決まる場合の input register の破壊を考えて
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2315 ませんでした。これも、どうすればいいんだ... まぁ、get_register_var
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2316 するのが簡単だよね。
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2317
69e2e763cce5 object assemble first try.
kono
parents: 106
diff changeset
2318 save register が狂っているようだね。max_register_var あたり?
110
fb502a0071f8 first binary run
kono
parents: 108
diff changeset
2319
fb502a0071f8 first binary run
kono
parents: 108
diff changeset
2320 Wed Mar 19 02:22:51 JST 2003
fb502a0071f8 first binary run
kono
parents: 108
diff changeset
2321
fb502a0071f8 first binary run
kono
parents: 108
diff changeset
2322 なんだか、struct のtag listが、int a,b,c; のようになっているのを
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2323 一つと数えているらしい。困ったものだ。前に言ったのをちゃんと
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2324 実装しよう。
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2325
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2326 macro のバグも見つけちゃったよ... むぅ。
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2327
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2328 でも、とりあえず、a.out は動きました。
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2329
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2330 Wed Mar 19 12:59:01 JST 2003
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2331
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2332 なんか、浮動小数点をprintfに引き渡すときは、rnレジスタにも
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2333 値をいれていて、しかも、そっちを見るみたいね。これは、
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2334 めんどくさい....
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2335 r4,r5 ... f1
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2336 r6,r7 ... f2
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2337 r8,r9 ... f3
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2338 f4 からは単独
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2339 (あぁ、なんか、これは異常にめんどくさいぞ... こんなことするなら
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2340 f0 から r0 にコピーさせてよ...)
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2341
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2342 40(r1)とかをprintfは、派手にぶっこわすようですね。いったい
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2343 どれだけ取れば良いんだろう?
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2344
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2345 -112 ぐらい? 今は-72程度か。
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2346
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2347 (なんか風邪ひいた... 家内がくるというのに...)
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2348
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2349 浮動小数点のバグも順調に取れています。
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2350
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2351 なんか、save_stack が余計なsaveしてない?
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2352 まぁ、一時変数を良く使うのでfree listを作った方が良いかもね。
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2353
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2354 その前に整数演算のチェックが必要だな。
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2355
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2356 Thu Mar 20 12:06:27 JST 2003
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2357
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2358 まだ、save したレジスタを破壊しているな。
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2359 set L_98,244
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2360 stw r15,lo16(-44+L_98)(r1)
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2361 ぐらいで、もう壊れちゃうみたい。ってことは、L_98 がもっと
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2362 大きくないとダメなのか。
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2363
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2364
116
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2365 Thu Mar 20 23:43:42 JST 2003
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2366
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2367 ようやっと、self compile が通りそう。register save 系が
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2368 やっぱり難しいみたいだね。dynamic loader を壊したりするし。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2369
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2370 あとmodがおかしいみたいで、hashの値が違うらしい。マイナスの値
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2371 になるunsignedのかけ算ねぇ。int.c のrecursionが通らない。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2372 まだ、offset がおかしいらしい。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2373
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2374 macro のバグもとれたし。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2375
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2376 一応は、self compile は通りました。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2377
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2378 Fri Mar 21 03:18:26 JST 2003
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2379
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2380 やっぱり、r1 と x(r30) の計算が合わない。きっと、
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2381 呼出側で、引数の分のoffset を用意しているのだろう。
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2382 だから、どれくらいの引数の関数を呼び出したかという
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2383 値がいるのではないか?
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2384
b14ff9671c90 register offset fix
kono
parents: 114
diff changeset
2385
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2386 Fri Mar 21 12:22:11 JST 2003
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2387
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2388 <------r1_offset------------------------------>
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2389 <------------lvar_offset------->
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2390 r+ +------------+---+---------------+----------+--------------+----+ -
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2391 caller arg xx register save local callee arg xx
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2392 reg_save disp max_func_args*size_of_int
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2393
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2394 ということだったみたいね。ようやっと self compile が通りました。
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2395
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2396 free_glist を作るか....
119
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2397
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2398 Sat Mar 22 11:17:41 JST 2003
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2399
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2400 creg/freg を g_expr の引数にした方が、レジスタマシン系では、素直な
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2401 みたい。そうすれば、
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2402 ## conv->static_();
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2403 addis r15,r31,ha16(_conv-L_242)
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2404 la r15,lo16(_conv-L_242)(r15)
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2405 lwz r3,0(r15)
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2406 lwz r3,244(r3)
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2407 mr r29,r3
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2408 mtctr r29
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2409 みたいな mr は減るね。もっとも一命令だけどさ。3% もあるみたい。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2410 ちょっと多いか... 386 での use_register もなくなるしなぁ。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2411 (あぁ、でも大半はポインタキャッシュだな。こっちを直す方が
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2412 簡単か)
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2413
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2414 まぁ、そういう最適化をしないっていうのが、このコンパイラの立場
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2415 なわけだけど。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2416
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2417
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2418 構造体の引数渡しでは、構造体そのものをレジスタに載せて
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2419 引き渡しているみたいだね。まったく... それで、あわてて
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2420 メモリに代入しているわけか。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2421
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2422 なんか mtctr r2; bdn Lxx とかいうのがあるのね。main frame っぽい!
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2423 これはベンチマーク用って感じだね。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2424
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2425
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2426 Sun Mar 23 16:06:29 JST 2003
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2427
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2428 Breakpoint 3, get_register () at mc-code-powerpc.c:235
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2429 235 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2430 (gdb) c 9999
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2431 Will ignore next 9998 crossings of breakpoint 3. Continuing.
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2432 test/basic.c:67:Bug of compiler
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2433
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2434 Breakpoint 2, errmsg () at mc-parse.c:214
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2435 214 if(lineno==0) return;
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2436 (gdb) info b
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2437 Number Type Disposition Enabled Address WhatStackFrame Condition IgnoreCount Commands
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2438 2 breakpoint keep y 0x0000ca08 in errmsg at mc-parse.c :214
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2439 breakpoint already hit 1 time
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2440 3 breakpoint keep y 0x000028e4 in get_register at mc-code-powerpc.c :235
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2441 breakpoint already hit 69 times
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2442 ignore next 9930 hits
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2443 (gdb) run
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2444 The program being debugged has been started already.
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2445 Start it from the beginning? (y or n) y
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2446 Starting program: /Users/kono/src/device/mc -s test/basic.c
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2447 [Switching to process 24650 thread 0x2307]
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2448 test/basic.c:67:Bug of compiler
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2449
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2450 Breakpoint 2, errmsg () at mc-parse.c:214
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2451 214 if(lineno==0) return;
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2452 (gdb) c 69
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2453
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2454 うまくいかんね。
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2455
b815fcd57b9d input var ( incomplete )
kono
parents: 117
diff changeset
2456 a+a+a....a で落ちてしまう。まぁねぇ。
124
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2457
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2458 結局、stack frame の問題か。
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2459
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2460 Mon Mar 24 03:06:32 JST 2003
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2461
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2462 Intel 側にもだいぶ embug してしまったようだ。
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2463
f52805504ffa *** empty log message ***
kono
parents: 119
diff changeset
2464 basicとかfloatの難易度を上げすぎたか?
125
e537da31dce3 struct push
kono
parents: 124
diff changeset
2465
e537da31dce3 struct push
kono
parents: 124
diff changeset
2466 mc-code-power.c のlvar は、
e537da31dce3 struct push
kono
parents: 124
diff changeset
2467 input arg > 0
e537da31dce3 struct push
kono
parents: 124
diff changeset
2468 local var < 0
e537da31dce3 struct push
kono
parents: 124
diff changeset
2469 output arg > ARG_OFF
e537da31dce3 struct push
kono
parents: 124
diff changeset
2470 とするべきだね。
e537da31dce3 struct push
kono
parents: 124
diff changeset
2471
e537da31dce3 struct push
kono
parents: 124
diff changeset
2472 Mon Mar 24 12:08:43 JST 2003
e537da31dce3 struct push
kono
parents: 124
diff changeset
2473
e537da31dce3 struct push
kono
parents: 124
diff changeset
2474 addi r27,r1,56
e537da31dce3 struct push
kono
parents: 124
diff changeset
2475 addi r29,r28,28
e537da31dce3 struct push
kono
parents: 124
diff changeset
2476 mr r3,r27
e537da31dce3 struct push
kono
parents: 124
diff changeset
2477 mr r4,r29
e537da31dce3 struct push
kono
parents: 124
diff changeset
2478 li r5,372
e537da31dce3 struct push
kono
parents: 124
diff changeset
2479 bl L_memcpy$stub
e537da31dce3 struct push
kono
parents: 124
diff changeset
2480 lwz r4,0(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2481 lwz r5,4(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2482 lwz r6,8(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2483 lwz r7,12(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2484 lwz r8,16(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2485 lwz r9,20(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2486 lwz r10,24(r28)
e537da31dce3 struct push
kono
parents: 124
diff changeset
2487 mr r3,r28
e537da31dce3 struct push
kono
parents: 124
diff changeset
2488 bl _main3
e537da31dce3 struct push
kono
parents: 124
diff changeset
2489
e537da31dce3 struct push
kono
parents: 124
diff changeset
2490
e537da31dce3 struct push
kono
parents: 124
diff changeset
2491 うーむ、最低な奴。最初の28byteだけレジスタ渡しなのか。アドレス
e537da31dce3 struct push
kono
parents: 124
diff changeset
2492 は変わらないんでしょうけど。まぁ、合わせなくても害は無いけどさ。
e537da31dce3 struct push
kono
parents: 124
diff changeset
2493 そのうちね。(そんなに難しくは無いが... また、function が複雑
e537da31dce3 struct push
kono
parents: 124
diff changeset
2494 怪奇になるな) しかし浮動小数点レジスタも使うとかそんなんじゃなくて
e537da31dce3 struct push
kono
parents: 124
diff changeset
2495 良かったかも。
e537da31dce3 struct push
kono
parents: 124
diff changeset
2496
e537da31dce3 struct push
kono
parents: 124
diff changeset
2497
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2498 stwu r1,lo16(-L_9)(r1)
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2499 とかしているから、局所変数は64k以内ってことだね。haしてもいいんだけどさ。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2500
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2501 Mon Mar 24 17:07:59 JST 2003
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2502
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2503 さて、ようやっと fact-a.c に取り掛かれるわけだけど、今のままだと、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2504 input register -> メモリへのsave
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2505 ってのがあるんだよね。これはいただけない。sub routine call すると、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2506 r0-r10 は破壊されちゃうし。ということは、code segment の引数は、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2507 r29-r20 が良いんじゃないか? 浮動小数点f31-f20を含めて。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2508
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2509 問題は、どこでinput register を指定するかだけど、get_input_register_var
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2510 で code 用かどうかを指定するのが良いかな。fnptr ではダメなので明示した
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2511 方が良いだろう。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2512
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2513 r31, r1 の設定があるのはやむを得まい。r1=r30であった方が良いのだろうか?
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2514 その方がfunction calll の時の変更が少ないだろう。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2515
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2516 メモリとinput register (この場合はr29-r20,f21-f20だけど)の対応は
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2517 どうする? 通常だと呼出側が確保するわけだけど、そうはいかないね。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2518 レジスタもsaveする必要が無いから、いろいろ簡単でよろしい。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2519
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2520 あとは、return/environment の扱いだけど。ia32 の方でもいろいろ
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2521 動かなくなっているようだな。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2522
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2523 Mon Mar 24 21:56:47 JST 2003
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2524
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2525 うーん、別にフレームを変えないで、そのままでいいか。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2526 その方が楽だよね。return しようと思うといちいち
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2527 frame をうごかさないといけないけど、return は
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2528 別処理するんだから、いらないか。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2529
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2530 Wed Mar 26 14:29:21 JST 2003
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2531
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2532 で、フレームを変えないとすると、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2533
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2534 <------r1_offset------------------------------>
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2535 * <------------lvar_offset------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2536 r+ +------------+---+---------------+----------+--------------+----+ -
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2537 callee arg xx register save ! local caller arg xx
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2538 reg_save disp max_func_args*size_of_int
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2539 lvar>0 lvar<0 lvar>0x1000 0000
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2540
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2541 なので、r1/r30 を常に移動させる必要がある。前のcode segement/
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2542 function がどこにr1/r30を持っていたかを知る手段はないので、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2543 jump する前に糢とに戻す必要がある。r30が固定ならばr1のみの
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2544 修正で良く、前に戻す必要はない。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2545
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2546 でも、r1_offset 分を戻せば良いだけなんだから、r30を * に固定
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2547 しても良いんじゃないか? ! でもいいんだけど。こっちの方が簡単
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2548 かな? code の場合は register_save は 0 (つまり、マイナス)な
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2549 わけだから。(まぁ、穴を開けておいても良いけど)
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2550
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2551 Intel の場合はどうして、こうしなかったのか? (でも、最後にチェック
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2552 した時にはcore dumpしていたが...)
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2553
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2554 ebp <-----esp----------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2555 <------r1_offset------------------------------>
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2556 * <------------lvar_offset------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2557 r+ +------------+---+---------------+----------+--------------+----+ -
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2558 callee arg xx register save ! local caller arg xx
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2559 reg_save disp max_func_args*size_of_int
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2560 lvar>0 lvar<0 lvar>0x1000 0000
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2561
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2562 というわけなので、* にそろえる方が intel 版とも一致する。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2563 ってことは、ebp の移動は intel でもやっていたってこと?
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2564 いやfunctionではこうなっているんだけど、code では違う。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2565
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2566
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2567 ebp <-----esp----------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2568 <------r1_offset------------------------------>
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2569 * <------------lvar_offset------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2570 r+ +------------+---+---------------+----------+--------------+----+ -
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2571 callee arg xx register save ! local caller arg xx
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2572 reg_save disp max_func_args*size_of_int
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2573 lvar>0 lvar<0 lvar>0x1000 0000
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2574
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2575 ってわけか。とすると powerpc では、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2576
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2577 r30 <------r1_offset------------------------------> r1
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2578 # * <------------lvar_offset------->
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2579 r+ +------------+---+---------------+----------+--------------+----+ -
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2580 xx callee arg zz register save ! local caller arg zz
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2581 reg_save disp max_func_args*size_of_int
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2582 lvar>0 lvar<0 lvar>0x1000 0000
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2583
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2584 の#にr30を固定してr1をずらすことになる。やっぱ、こっちだよね。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2585 zz はから。xx に、base となる関数呼び出しが来る。から、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2586 calle arg は破壊される。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2587
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2588 どっちも可能だな。両方実装する? やっぱり後者からかな。gcc は
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2589 前者の方が簡単だろう。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2590
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2591 入力変数をレジスタに割り振ってしまうと、その範囲では
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2592 簡単に動いてしまう。(そりゃ、そうだ...)
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2593
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2594 goto with environment で構造体を返すのには注意が必要。
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2595 どこでコピーする? goto した場所? return-continuation?
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2596 そうねぇ。return-continuation 側が普通でしょう。あぁ、
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2597 でも返し先は元の関数呼び出しの引数上だから壊れちゃって
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2598 いるかもね。だから、とっておく実装の方が良いわけね。
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2599
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2600 (なんか -O3 にすると、mc1 が落ちるな...)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2601
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2602 Sat Mar 29 16:35:18 JST 2003
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2603
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2604 r30 <------r1_offset------------------------------> r1
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2605 # * <------------lvar_offset------->
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2606 r+ +------------+---+---------------+----------+--------------+----+ -
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2607 xx callee arg zz register save ! local caller arg zz
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2608 reg_save disp max_func_args*size_of_int
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2609 lvar>0 lvar<0 lvar>0x1000 0000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2610
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2611 このままだと、* が previous r1/r30 になるので、function から
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2612 goto する時に戻り番地やzzにあるはずのsaved r31/r30が破壊されて
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2613 しまう。それは、ちょっと困るということは、一旦、dummy subroutine
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2614 (普通はstub っていうか)を呼び出す方が良い? 戻り番地とprevious r1/r30
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2615 は持ち歩いているわけだけど... また、r20-r29はつぶされてしまう
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2616 ので、前もってsaveする必要もある。f31-f20も。(結構多いな...)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2617
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2618 # * r30 <--------------r1_offset-----------> r1
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2619 r+ +--+----------+----------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2620 xx zz reg save !callee arg!code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2621 r20-r29
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2622
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2623 これだと environment は持ち運ぶ必要はない? いや、ある?
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2624 逆に戻り番地を持ち運ぶ必要はなくなるわけね。そっちの
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2625 方がきれいかな。goto-cotinuation みたいな感じか。
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2626
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2627 返り側は、
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2628
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2629 lwz r1,continuation
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2630 lwz r1,0(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2631 lwz r0,8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2632 mtlr r0
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2633 lmw r30,-8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2634 blr
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2635
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2636 程度で良い? このr30ってのはgoto先では知り得ない。いや、待てよ、
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2637 この場合は、r20-r29って決まっているわけか。
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2638
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2639 lwz r1,continuation
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2640 set r3/f1 as a return value
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2641 lwz r1,0(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2642 lwz r0,8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2643 mtlr r0
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2644 lmw r20,-148(r1) (?!)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2645 blr
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2646
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2647 で良いわけか。構文は同じでreturn addressは無視することにするか。
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2648 呼出側は、
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2649
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2650 通常の関数呼び出し (引数0) (は、手間0だから..)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2651 bl L_stub_NN
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2652 L_return: (普通のretrunもあるから、必要な場合がある)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2653 lwz r1,0(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2654 lwz r0,8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2655 mtlr r0
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2656 lmw r20,-8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2657 blr
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2658 L_stub_NN:
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2659 mflr r0
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2660 bl L_61
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2661 L_65:
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2662 lwz r1,0(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2663 lmw r23,-108(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2664 b restFP+36 ; restore f23-f31
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2665 L_61:
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2666 stmw r23,-108(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2667 stw r0,8(r1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2668 b saveFP+36 ; save f23-f31
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2669
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2670 ちょっと複雑すぎるかな。特に gcc では、こういう操作は難しいかも。
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2671
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2672 あ、そうか。register saveは、このy関数が呼び出された時点で
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2673 やってしまえば良い。そうすれば必要ない。戻り番地も既に xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2674 に入っている。だよね。
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2675
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2676 * gotoを呼び出した関数のr1 ! r1(goto前のr1)
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2677 # * r30<--r1_offset-------------> r1
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2678 r+ +----------+--+----------+----------------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2679 cousin arg xx reg save !callee arg !code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2680 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2681 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2682 *size_of_int *size_of_int
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2683
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2684 とすれば stub は必要ない。cousin arg も保存されている。goto の
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2685 引数のみがlocal変数を上書きする形で格納される。これで、original
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2686 のIA32実装と一致することになる。(引数の保存を除いて。いや、
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2687 元のも保存されているんじゃないの?)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2688
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2689 それで、code segment から関数呼出しするときは? (ってことは、
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2690 それようのテストも必要なわけか...)
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2691
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2692 Wed Apr 2 17:40:32 JST 2003
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2693
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2694 register 変数が既に使われていても、わざわざsaveする必要はない。
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2695 戻って来ないから。register を使ったことにするには、used_max_register_var
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2696 を設定してやれば良い。
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2697
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2698 Interl版で goto が動かなくなったのは、arg_offset が、register 変数分
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2699 も取るようになったから。save することを考えると、その方が良い。実際、
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2700 function call があるとsaveされてしまう。ということは、別に r20-r29
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2701 である必要はないってことか。通常のinput register varで良い。とすると、
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2702 register変数をsaveする必要もないね。
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2703 ただ、input regsiter var は、function callの前には saveする必要が
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2704 ある。でも、これは、やっぱり手遅れか。ってことは、やっぱり、
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2705 r20-r29が良いってことか。
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2706
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2707 jump() では、呼出し引数は、-arg_size つまり、局所変数と
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2708 同じ扱いになっている。ってことは、
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2709
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2710 * gotoを呼び出した関数のr1 ! r1(goto前のr1)
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2711 # * r30<----r1_offset---------> r1
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2712 r+ +----------+--+----------+----------------+-----------+----------+----+
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2713 cousin arg xx reg save !callee arg !code local caller arg xx
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2714 r20-r29 lvar >0 lvar<0 lvar>0x1000 000
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2715 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2716 *size_of_int *size_of_int
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2717
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2718 r1 <----------------------r30 (return continuation)
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2719
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2720 で、callee arg は保存されたまま、code local だけ変わるってことだね。
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2721
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2722 return continuation で、構造体を返そうと思うと難しい。そもそも、
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2723 浮動小数点が、ちゃんと返るのか?
130
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2724
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2725 Thu Apr 3 13:47:23 JST 2003
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2726
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2727 r1 は stack top に保存してあるものを、そのままenvironment
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2728 として渡すのが良い。
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2729
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2730 stack 上のデータが64kbyteなのは制限だが、やむをえまい。
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2731
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2732 というわけで、powerpc 版の CwC はできあがり。
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2733
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2734 return continuation での構造体の引渡し
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2735 function のprototypeでの重複した引数の省略
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2736
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2737 あたりが、まだ、テストしていない。あと、
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2738
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2739 関数単位での構文木の作成
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2740 従来のフレーム構造の再利用バージョン
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2741
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2742 も課題ではある。
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2743
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2744
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2745 Fri Apr 4 10:41:22 JST 2003
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2746
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2747 おいぉい、-O3 にすると、mc-codegen.c の arg_register は
fea1b499d47b fix register var save
kono
parents: 128
diff changeset
2748 r14 まで使うよ。それは、まずいんでないかい? 困ったなぁ。
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2749
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2750 Mon Apr 7 14:29:51 JST 2003
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2751
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2752 そういえば、unsigned char は処理してんの? crgvar はあるけど、
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2753 curgvar とかはないみたいだけど。
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2754
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2755 あと、-1.0 とかが d2i とかを生成するのを直してないんでないかい?
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2756
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2757 MIPS の比較命令は、
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2758
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2759 beq $2,$3,$L18
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2760
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2761 slt $2,$2,$3
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2762 bne $2,$0,$L17
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2763
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2764 という感じなわけね。(signed less than か?)
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2765
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2766 だとすると今の方法ではうまくないかも。
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2767
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2768 PS2Linuxのアセンブラが低能すぎて、forward reference を全然
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2769 解決してくれない。どうすりゃいいんだ?
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2770
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2771 .include を使うと良いらしい。(そんなんでいいのか?!)
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2772
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
2773 csvalue() で取って来たregiserを誰がfreeするの?
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2774
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2775 Tue Apr 8 14:52:06 JST 2003
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2776
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2777 MIPSには bgez とか bgtz とかいう命令があるのね。なんかに
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2778 使えるの? 使えるけどさ。今のコンパイラで使う方法は?
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2779
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2780 gccが浮動小数点レジスタを避けるようにコンパイルしている
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2781 のは何故だろう? 遅いから? jal dcmp とかは、やっぱり変。
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2782
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2783 double と float の差が良くわからない。
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2784
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2785 Wed Apr 9 16:20:00 JST 2003
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2786
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2787 LOR LAND の定数の扱いを追加
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2788
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2789 配列の処理があるから、変数*定数ぐらいのh最適化は
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2790 入れた方が良いかも。その方がレジスタも少なく使うし。
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2791 (また?)
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2792
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2793 授業で使うように、また、最適化を落したものが必要かな。
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2794
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2795 MIPSの浮動小数点ってさ、single precision しか機械語命令が
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2796 ない? dpsub とかを呼び出すのっておかしくない? (まぁ、
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2797 いいんだけどさ)
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2798
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2799 Fri Apr 11 14:36:33 JST 2003
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2800
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2801 (二日酔だ...)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2802
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2803 要するに、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2804 浮動小数点レジスタは single float しか使えない
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2805 double は、すべて、汎用レジスタに置き、計算はすべて、 subroutine
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2806 ってことだよね。(あ〜、やだやだ)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2807
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2808 single float だけでの演算を導入するためには、DSUBの他にFSUB
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2809 などを導入する必要がある。これは「うざい」。不可能じゃないけ
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2810 ど、かなりめんどくさいね。浮動小数点誤差の問題もあるし。全部
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2811 double に変換してから計算すれば問題ないかと言うと、そんなこ
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2812 とはないわけだが。せめて、浮動小数点レジスタ上での演算をおこ
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2813 なうsubroutineはないの? (あるかも知れない)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2814
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2815 まぁなぁ。FCOMPとかやればいいだけなんだけど。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2816
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2817 Sat Apr 12 13:30:07 JST 2003
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2818
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2819 jal dpadd は、やっぱり、かなり複雑な浮動小数点演算だというが
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2820 わかった。IEEEの形式と合わないとかとかでそうなったんじゃなか
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2821 ろうか? もっとも、PlayStation に合わせてあるのかも知れないけ
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2822 ど。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2823
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2824 ということで、single float 計算を入れないと、もとのgcc との
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2825 差が大きすぎるだろうと思う。ってことは、fmachineop とか FSUB
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2826 を入れないとだめってことか。まぁ、やれば、いいだけなんだけど、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2827 他のCPUとの調節がなぁ...
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2828
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2829 今は、float の演算もpipeline上では1clockなんだろうから、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2830 できればdouble でやって欲しいけどね。とはいえ、double/float
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2831 の変換が不要になるので、float base だとMIPSの方が速い
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2832 ってことにはなるかも知れない。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2833
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2834 gdb のdisass を見ると、jal bpadd とかは特定レジスタ
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2835 を使った間接代入になっているらしい。また、disass の
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2836 レジスタ表示が、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2837
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2838 $a0 $a2 $a3 $at $f0 $gp $ra $s0 $s1 $sp $t9 $zero $v1 $f12 $at
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2839
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2840 とかなので、よくわからん。こまったものだ。これも、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2841 ちょっと時間かかるのかな?
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2842
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2843
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2844 まぁ、なぁ... ANSI-C に従おうと思うと、このあたりのfloat/double
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2845 はうっとうしいよね。でも、とりあえず動けば良い?
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2846
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2847 expr の引数として「output type」を入れるか? 基本的には assign
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2848 で決まるtypeを要求する。やっぱり、C の規格書がいるんだろうなぁ。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2849 (それは嫌だな...) CbC として、そういうものを入れるのが本当に
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2850 正しいの? (さぁねぇ...)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2851 float = float op float
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2852 は良いんだけど、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2853 double = float op float
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2854 の時に、必要な精度を確保できない。cast すれば良いんだけど、それは
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2855 ANSI-C とは異なる挙動になってしまう。ま、いいか。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2856
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2857 MIPSはdouble=float ということにするっていう手もあるね。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2858 その方がきれいか。でも、どうせ、他のCPUもあることを考えると、
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2859 fbinop するんじゃないの? lbinop も出さないとだめだろうし。
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2860 short とかunsigned char の扱いもね。(sigh...)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2861
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2862 まぁ、時間の問題だから、やれば良いだけなんだけど。めんどい!
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2863
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2864 (せめてdoubleのルーチンが浮動小数点レジスタを使ってくれれば
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2865 楽だったのに〜)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2866
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2867 Mon Apr 14 23:29:37 JST 2003
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2868
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2869 やっぱり、ちょっと変更大きいなぁ。
134
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2870
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2871 Fri May 2 14:53:16 JST 2003
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2872
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2873 なんでもいいけど、power-pc の test/basic が通らなくなってる。
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2874 (ま、そうだよな....) struct-pushと args-works の途中で
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2875 動かなくなったらしい。
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2876
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2877 あと、引数の引渡しだけど、printf (...) だけ特別扱いしたら?
7a55819b0482 *** empty log message ***
kono
parents: 133
diff changeset
2878 プロトタイプがあるのを特別扱いする必要はないんじゃない?
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2879
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2880 Sat May 3 18:38:57 JST 2003
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2881
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2882 わかりました。contains_in_list を修正するのを忘れているね。
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2883 あと、get_register は、どうせ足りなくなるわけだろ? その
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2884 時はどうするの? 足りなくなるのは関数呼び出しの時だけ?
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2885 (かな?)
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2886
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2887 だとすれば、関数呼び出しのsaveの変数を局所変数も使えるように
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2888 すれば良いだけだね。
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2889
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2890 Sun May 4 09:18:32 JST 2003
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2891
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2892 関数呼び出し時の浮動小数点を格納する、r8,r9 の扱いが
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2893 おかしい。
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2894
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2895 emit_push / tosop で局所変数だけは特別扱い
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2896 した方がいいんじゃない? register full だと、
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2897
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2898 register にload (emit_push)
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2899 register full でそれを局所変数に代入 (*)
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2900 演算時にregisterに再代入
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
2901
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2902 まぁねぇ。それだと、mc-code-386.c の時代に戻るわけ
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2903 だけど。まぁ、その方がいいのかな。もっとも、(*)
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2904 が起こらなければ、特に問題はないんだけどね。
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2905
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2906 局所変数、大域変数、定数の足し算とかは処理した方がいいのかなぁ。
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2907
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2908 Sun May 4 15:10:48 JST 2003
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2909
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2910 たぶん、oprt とかは、それほど効果は無いよ。効くのは、
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2911 register full の時だけだろ?
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2912
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2913 MIPS version は、まだまだ全然と言う感じ。ゆっくり
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2914 片付けて行くしかないね。
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2915
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2916 Sun May 4 18:29:26 JST 2003
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2917
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2918 d50 では、引数はレジスタに $4,$5,$6,$7 の double 二つしかのらない。
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2919
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2920 f50 では、引数は
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2921 $f12,$f14,$6,$7
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2922 というように4つ乗るらしい。(こまったもんだ...)
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2923
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2924 i50では、$4,$5,$6,$7 だね。
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2925
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2926 あとはstackに積むみたいね。
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2927
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2928 これらを get_input_register_var で処理するわけか。
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2929
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2930 Mon May 5 15:28:07 JST 2003
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2931
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2932 code_fconst/code_dconst と code_drgvar(e4,d,reg) みたいなのが
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2933 入混じってるな。ま、いいんだけど。
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2934
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2935 やっぱり、後者に統一。(めんどさ〜) free で d を指定するのはまずい。
141
kono
parents: 138
diff changeset
2936
kono
parents: 138
diff changeset
2937 Thu May 8 11:02:42 JST 2003
kono
parents: 138
diff changeset
2938
kono
parents: 138
diff changeset
2939 regs/fregs の複数は必要ないんじゃないか? 一つで良い? 外から
kono
parents: 138
diff changeset
2940 は見えないから、mc-code-mips だけでそうするのが良い。
kono
parents: 138
diff changeset
2941
kono
parents: 138
diff changeset
2942 register のやり方を工夫しないとだめか。
kono
parents: 138
diff changeset
2943
kono
parents: 138
diff changeset
2944 あーめんどい.... 本当に動くのか?
kono
parents: 138
diff changeset
2945
kono
parents: 138
diff changeset
2946 double のライブラリ呼び出しで$3,$4,$5,$6 を使うわけだけど、
kono
parents: 138
diff changeset
2947 ここは必ずあけておかなければいけないわけだよね。でも、実際に
kono
parents: 138
diff changeset
2948 は、ライブラリの呼び出し後には$3,$4 が使われてしまう。ここで、
kono
parents: 138
diff changeset
2949 emit_push されると気まずいが...
kono
parents: 138
diff changeset
2950
kono
parents: 138
diff changeset
2951 本当のfunction callと同じ扱いでもいいんだけど、それだと
kono
parents: 138
diff changeset
2952 ちょっときつくない?
kono
parents: 138
diff changeset
2953
kono
parents: 138
diff changeset
2954 なんか浮動小数点レジスタ変数へのdpreinc/dpostinc を定義して
kono
parents: 138
diff changeset
2955 ないんじゃない? それは、まずいんじゃないの? dassop もそうか?
kono
parents: 138
diff changeset
2956 あれ? なんか何もしてないみたいだな。Intel 版にはレジスタ変数
kono
parents: 138
diff changeset
2957 がないから、テストしなかったのか。code の引数はレジスタに割
kono
parents: 138
diff changeset
2958 り当てられるから、そのあたりでテストすることは可能だろうね。
kono
parents: 138
diff changeset
2959 まぁ、これ自体は難しくはないが...
kono
parents: 138
diff changeset
2960
142
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2961 code segment では浮動小数点レジスタに割り振られてしまうので、
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2962 実はエラーが出ていたんじゃないかな。これはテストプログラム
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2963 を書くべきでしょうね。
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2964
141
kono
parents: 138
diff changeset
2965 あるいは#define REG register でテストする必要があるわけね。
kono
parents: 138
diff changeset
2966
kono
parents: 138
diff changeset
2967 MIPSでは、$4,$5,$6,$7 は、本当に特別扱いしないとだめだね。
142
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2968
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2969 Thu May 15 21:25:45 JST 2003
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2970
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2971 fregv は、やっぱりサブルーチン・コールにするんだろ?
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2972 (さすがに授業が始まってしまうと、なかなか進まない...)
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2973
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2974 Sat May 17 13:57:12 JST 2003
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2975
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2976 $4,$5 を常に creg または、double のfregとして使う。
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2977 $f12 はfloating 用。
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2978
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2979 もちろん、emit_pushすればずれちゃうけどね。rename するべきか?
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2980 そもそもrenameは必要ないんじゃないの?
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2981
de272ad4ddce mips continue
kono
parents: 141
diff changeset
2982 あともう少しなんだけどねぇ。やる気がでん...
143
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2983
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2984 Tue May 20 11:08:44 JST 2003
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2985
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2986 freg と同じように dreg を作る? (そうすると ia32
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2987 の書き直しがあるが、それは良いとして...)
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2988
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2989 でも、mc-codegen.c が creg/freg に依存しているから、
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2990 それを書き直すのが結構めんどくさい。書き直して
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2991 大丈夫なのか? ううーん...
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2992
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2993 逆にcreg/dreg/freg を無くすってのは? 全部、creg で
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2994 やるわけだな。ちょっと書き直しが多いけど。原理的には
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2995 それでいいはずだけど。着目しているcurrent register
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2996 は一つのはずだから。
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2997 (1)
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2998 creg int
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
2999 freg double/float
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3000
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3001 ってなっているからおかしいのであって、
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3002 (2)
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3003 creg int/double/float
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3004 か、
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3005 (3)
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3006 creg int
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3007 freg double
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3008 greg float
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3009 だよねぇ。
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3010
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3011 やっぱり(2)かなぁ。long long のことをとかを考えると。
66ddda268ac5 *** empty log message ***
kono
parents: 142
diff changeset
3012 でも、とりあえず(1)でやるか。
144
56211702f298 creg/freg continue
kono
parents: 143
diff changeset
3013
56211702f298 creg/freg continue
kono
parents: 143
diff changeset
3014 いずれにせよ、fregv を追放することからはじめるんじゃない?
56211702f298 creg/freg continue
kono
parents: 143
diff changeset
3015
56211702f298 creg/freg continue
kono
parents: 143
diff changeset
3016 それはできました。
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3017
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3018 Thu May 22 23:40:13 JST 2003
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3019
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3020 3808 macro = (char *)car(nptrm->dsp);
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3021 3809 if (nptrm->sc==MACRO) {
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3022 3810 while((*macropp++ = *macro++));
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3023 3811 macropp[-1]=c;
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3024 (gdb)
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3025 3812 } else if (nptrm->sc==FMACRO) {
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3026 3813 if(c!='(') error(MCERR);
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3027 3814 *macropp++=0;
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3028 3815 macrop = macro_function(macrop,&body,nptrm,
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3029 3816 list2((int)macro,history));
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3030
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3031 MACRO の場合のrecursive な処理を忘れいているみたいだけど。
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3032 それでも良かったはずなんだけど、macro_buf がstatic なので
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3033 不都合が出ているみたいね。
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3034
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3035 recursive に処理すると、
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3036 #deifne car(e) heap[e]
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3037 car(e)
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3038 みたいな時にまずい。これは、どうするんだっけ?
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3039
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
3040 LMACRO ってのがあったみたいね。
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3041
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3042 Sun May 25 21:48:46 JST 2003
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3043
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3044 macro_eval がまだおかしいのは置いといて...
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3045
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3046 単純にcreg/fregを統一してしまうと、
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3047 fdecl で creg をセット
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3048 した時に、float/double/int にどれかに固定される。そのまま、
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3049 coce_rlvar(creg) とかを呼ばれてしまうので、ちょっと困る。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3050 code_rlvar で、if(!is_int_reg(creg)) creg = ireg;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3051 とかすればいいんだけど、それは、ちょっと変だよね?
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3052
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3053 そもそも、mc-codgen.c でcregを持ち歩いている理由は?
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3054 なんかあったような気がするが...
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3055
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3056 そうか、
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3057 use_int_reg()
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3058 とかしてやれば良いわけね。(rname を使うかどうかはともかく)
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3059
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3060 code_rlvar とかで設定するregisterを勝手に変えられると
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3061 うれしくない。(よね?) codegen 側で use_int_reg()とか
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3062 できればいいんじゃないの?
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3063
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3064 Mon May 26 21:06:14 JST 2003
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3065
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3066 code_* 側でやるか、mc-codegen 側で行うか? どっちかなぁ。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3067 code_* 側の方が良いような気もするけど。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3068
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3069 Thu May 29 10:30:09 JST 2003
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3070
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3071 freg/creg の区別は mc-codegen 側でやっていたんだから、
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3072 mc-codegen 側でやらないと、mc-cdoe-* 側での動的
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3073 チェックが増えすぎてしまう。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3074
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3075 creg/freg を共有するのは良いのだが、その設定は
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3076 mc-codegen 側ですべきなんじゃないの?
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3077
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3078 mc-code-* 側を修正するとバグが取り切れない...
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3079 (といいつつ、もう、すぐなんだろうけど... でも、なぁ)
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3080
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3081 cast を自分で定義できる言語なら簡単なんだろうけど。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3082
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3083 Tue Jun 3 13:03:41 JST 2003
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3084
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3085 あぁ、なんか乗り切れない。CONV の直前でcregが不定だ。
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3086 どっかで use_float を忘れているんだろうな。
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3087
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3088 Wed Jun 11 12:27:58 JST 2003
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3089
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3090 なんか、ようやっと creg/ireg/freg が片付いたよ。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3091 creg を変更したときに、ireg を変更し忘れることが多かった
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3092 みたい。set_creg を必ず使うようにすれば良いだけだと思う
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3093 のだが。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3094
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3095 Thu Jun 12 19:34:48 JST 2003
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3096
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3097 まぁ、MIPS用のレジスタ割り当てを書かないとだめだね。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3098 ちゃんと書いてもいいんだけどさ。なんか one path に
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3099 するのが面白いんでしょ?
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3100
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3101 Sun Jul 13 18:26:29 JST 2003
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3102
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3103 また、一カ月なにも書かなかったのか。 mips は、mc-code-power.c
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3104 から書き直した方が良さそうだね。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3105
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3106 regs/regv は、i/f/d のすべてのレジスタに関して一つ
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3107
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3108 でないと stack に積むのを統一できないから。そういう意味では、
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3109 reg_stack と freg_stack を区別する意味はないわけね。でもstack
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3110 は型付けした方が良いから。でも、区別しておくと、long を増や
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3111 した時にも、stack を増やさないとだめなんじゃない? なので区別
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3112 しない方が良い。でも、それに手をつけると、また時間かかるんじ
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3113 ゃないの? そのためにはスタックそのものに型付けしないとだめだ
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3114 から結局同じか。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3115
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3116 mips の double を格納するためのregister pairは、regs に
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3117 格納する。regs にアクセスには必ずアクセス関数を通す。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3118 なるほど。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3119
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3120 get_input_dregister_var なんだけど、dregister pair の
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3121 場合は、常にpairが決まった値になる必要があるよね。
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3122 この分はどうする? 前もってとっておくか?
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3123
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3124 あ、そうか、任意のregister pairを許さなくても良いよ。input register
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3125 に対応する連続したregister pair だけを許そう。そうすれば、あ
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3126 まり気にしなくても良くなるから。でも、gcc が奇数pairを許して
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3127 いたら気まずくない?
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3128
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
3129 regv は、register rename がなければいらないんじゃない?
150
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3130
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3131 Mon Jul 14 10:54:46 JST 2003
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3132
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3133 なんかなぁ... creg/ireg/freg/dreg は、あんまり良いアイデア
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3134 では、なかったみたい。creg は、このうちのどれかでなくては
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3135 ならないんだが、それを保証できない。
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3136
f8271009a314 MIPS continue
kono
parents: 148
diff changeset
3137 前と同じで、creg を廃止して、ireg/freg/dreg/lreg とするか?
151
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
3138
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
3139 Mon Jul 14 14:25:23 JST 2003
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
3140
81032a1b8a5d MIPS continue
kono
parents: 150
diff changeset
3141 なんか unsigned が通らなくなっているみたい。
153
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3142
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3143 Sun Jul 20 17:37:34 JST 2003
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3144
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3145 やっぱり dictionary は、書き直さないとだめだよな。
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3146 それに関して、heap も修正した方が良い。このコード
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3147 はあんまりだものなぁ。
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3148
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3149 さて、あとは、オフセットだけど... めんど...
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3150
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3151 Mon Jul 21 15:12:56 JST 2003
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3152
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3153 Frame pointer は使うの? 使った方がいいんじゃない?
33b39002ac58 MIPS continue
kono
parents: 151
diff changeset
3154 PowerPC は使わなかったけど。
154
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3155
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3156 Tue Jul 22 08:12:48 JST 2003
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3157
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3158 switch 文をtableにコンパイルするには...
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3159
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3160 最初の比較の行き先を後で指定するようにする
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3161 cmp reg,case_value
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3162 bne L_NEXT
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3163 ....
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3164 L_NEXT:
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3165 を、
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3166 cmp reg,case_value
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3167 bne L_CASE
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3168 ....
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3169 L_NEXT:
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3170 ....
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3171 L_CASE
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3172 で、case 文が終ったらtableを作る。table がいらないようだったら、
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3173 L_CASE = L_NEXT
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3174
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3175 各caseの入口は覚えておく。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3176 (list of (value, label))
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3177
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3178 table は、どうやって作るかと言うと、
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3179
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3180 まず、値の分布をチェックする
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3181 密度の高い表を作る(端のいくつかを除いて連続していること)
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3182 というか、(定差分で)連続している部分にだけ表を作れば良いか。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3183 table は8entry以上。それ以下は、2分法に負ける。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3184 (list of (number of entry, diff, (list of (value,label))))
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3185
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3186 512 or 128kbyte まで容認する。限度はなくても良いか。連続している
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3187 部分にしか表は作らない。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3188
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3189 連続してない部分は、2分法にする。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3190
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3191 2 分法でもいいけど。2分法にする? その方が簡単かな。最後のス
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3192 テージは、(順序が一致していれば...) 元のコードが使えるし。そ
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3193 うすると、sort して、真中かから比較して行けば良い。そうすれ
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3194 ば表の分布とか考えなくても良いからいいかもね。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3195
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3196 簡単じゃん。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3197
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3198 まぁ、やっぱり、構文木の先読みをするんじゃないの? そうすれば
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3199 reference のとられてない変数もわかるし。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3200
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3201 Wed Jul 23 16:21:12 JST 2003
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3202
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3203 やっぱり構造体のタグの名前はname tableにいれちゃだめだね。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3204 まぁ、いれなきゃいけないんだけどさ。どうする?
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3205 どうするっていっても...
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3206
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3207 Thu Jul 31 15:07:08 JST 2003
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3208
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3209 C から変換したコードは動いたけど。まぁ、cast は動くのは
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3210 良いんだけど、こういうのじゃなくて、link を使った変換
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3211 でもいいんじゃない? そうすれば、spagety stack でもOk
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3212 だな。ただ、GC がないと使い物にならないだろうが。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3213
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3214 Link にすれば、型整合のある変換も可能だよね。ただ、union
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3215 は意味ないか。record 型に直さないとね、
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3216
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3217 recursion と loop をdetect すれば、static にcompile
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3218 できる。あるいは、recursion の部分だけ配列にできる
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3219 んじゃないかな。
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3220
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3221 それぞれの利点と欠点を考察すればCWは通るんじゃない?
3edd10355434 fix assign_opt and conv.c
kono
parents: 153
diff changeset
3222 (本気?)
155
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3223
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3224 Mon Aug 4 12:48:40 JST 2003
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3225
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3226 converted call
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3227 480
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3228 8.070u 0.010s 0:08.22 98.2% 0+0k 0+2io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3229 call
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3230 480
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3231 6.590u 0.000s 0:06.67 98.8% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3232
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3233 だいたい10%ぐらい遅いなぁ。(なんで?) げ、-O6 だと十倍違う...
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3234
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3235 げ、powerpc の subroutine 内のstaticが通らんじゃん。
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3236
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3237 サブルーチンを三段に直しました。
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3238
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3239 % time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3240 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3241 9.590u 0.010s 0:09.64 99.5% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3242 % time ./a.out 1
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3243 719
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3244 12.610u 0.020s 0:12.71 99.3% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3245 % time ./a.out 2
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3246 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3247 6.310u 0.020s 0:06.41 98.7% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3248 % vi test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3249 % gcc -O6 test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3250 % ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3251 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3252 % time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3253 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3254 1.990u 0.020s 0:02.03 99.0% 0+0k 0+2io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3255 % gcc test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3256 % time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3257 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3258 7.530u 0.000s 0:07.64 98.5% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3259 % gcc -O2 test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3260 % time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3261 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3262 3.520u 0.010s 0:03.55 99.4% 0+0k 0+0io 0pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3263 %
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3264
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3265 ま、こんなものかな。-O2 に負けるなよって気もするが。
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3266
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3267 琉大は40Mbps
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3268
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3269 Intel PC (on PowerPC) の場合
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3270
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3271 [root@localhost ~/device]# time ./a.out 2
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3272 470
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3273 0.660u 0.010s 0:02.37 28.2% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3274 [root@localhost ~/device]# time ./a.out 3
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3275 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3276 0.920u 0.020s 0:01.74 54.0% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3277 [root@localhost ~/device]# gcc test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3278 [root@localhost ~/device]# ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3279
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3280 [root@localhost ~/device]# time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3281 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3282 1.310u 0.030s 0:01.39 96.4% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3283 [root@localhost ~/device]# gcc -O test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3284 [root@localhost ~/device]# time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3285 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3286 1.130u 0.030s 0:01.16 100.0% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3287 [root@localhost ~/device]# gcc -O4 test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3288 [root@localhost ~/device]# time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3289 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3290 0.870u 0.000s 0:00.87 100.0% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3291 [root@localhost ~/device]# gcc -O6 test/conv1.c
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3292 [root@localhost ~/device]# time ./a.out 0
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3293 720
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3294 0.850u 0.020s 0:00.88 98.8% 0+0k 0+0io 92pf+0w
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3295 [root@localhost ~/device]#
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3296
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3297 PowerPC の場合は、PIC symbol がやっぱり遅いね。
ccb2002d8a31 *** empty log message ***
kono
parents: 154
diff changeset
3298 こいつをなんとかするだけでだいぶ違うかも知れない。
156
da529eab5618 static initialization
kono
parents: 155
diff changeset
3299
da529eab5618 static initialization
kono
parents: 155
diff changeset
3300 Tue Aug 5 13:53:43 JST 2003
da529eab5618 static initialization
kono
parents: 155
diff changeset
3301
da529eab5618 static initialization
kono
parents: 155
diff changeset
3302 む、なんか、もう、そうなってるじゃん。
da529eab5618 static initialization
kono
parents: 155
diff changeset
3303
da529eab5618 static initialization
kono
parents: 155
diff changeset
3304 関数scope 内の staticの初期化が通らないんですけど。
da529eab5618 static initialization
kono
parents: 155
diff changeset
3305
da529eab5618 static initialization
kono
parents: 155
diff changeset
3306 直りました。対応してなかったみたいね。
158
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3307
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3308 Wed Aug 6 12:07:07 JST 2003
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3309
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3310 [kono@pw001 ~/device]% ./mc -s test/conv1.c
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3311 [kono@pw001 ~/device]% gcc test/conv1.s
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3312 [kono@pw001 ~/device]% time ./a.out 1
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3313 セグメントエラー (coreを出力しました)
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3314 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 73pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3315 [kono@pw001 ~/device]% time ./a.out 2
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3316 470
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3317 0.350u 0.000s 0:00.35 100.0% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3318 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3319 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3320 0.650u 0.010s 0:00.65 101.5% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3321 [kono@pw001 ~/device]% time ./a.out 1
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3322 セグメントエラー (coreを出力しました)
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3323 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 73pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3324 [kono@pw001 ~/device]% time ./a.out 2
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3325 470
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3326 0.350u 0.000s 0:00.35 100.0% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3327 [kono@pw001 ~/device]% time ./a.out 3
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3328 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3329 0.380u 0.000s 0:00.38 100.0% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3330 [kono@pw001 ~/device]% time ./a.out 4
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3331 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 77pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3332 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3333 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3334 0.660u 0.000s 0:00.65 101.5% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3335 [kono@pw001 ~/device]% time ./a.out 1
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3336 セグメントエラー (coreを出力しました)
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3337 0.010u 0.000s 0:00.00 0.0% 0+0k 0+0io 73pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3338 [kono@pw001 ~/device]% time ./a.out 2
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3339 470
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3340 0.350u 0.010s 0:00.35 102.8% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3341 [kono@pw001 ~/device]% time ./a.out 3
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3342 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3343 0.390u 0.000s 0:00.38 102.6% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3344 [kono@pw001 ~/device]% time ./a.out 4
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3345 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 77pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3346 [kono@pw001 ~/device]% gcc test/conv1.c
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3347 [kono@pw001 ~/device]% time ./a.out 1
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3348 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 77pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3349 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3350 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3351 0.430u 0.000s 0:00.42 102.3% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3352 [kono@pw001 ~/device]% gcc -O test/conv1.c
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3353 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3354 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3355 0.370u 0.000s 0:00.36 102.7% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3356 [kono@pw001 ~/device]% gcc -O2 test/conv1.c
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3357 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3358 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3359 0.370u 0.000s 0:00.37 100.0% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3360 [kono@pw001 ~/device]% gcc -O6 test/conv1.c
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3361 [kono@pw001 ~/device]% time ./a.out 0
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3362 720
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3363 0.240u 0.010s 0:00.25 100.0% 0+0k 0+0io 88pf+0w
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3364
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3365 Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/2.95.3/specs
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3366 gcc version 2.95.3 20010315 (release)
7bc02f0800a9 fix conv1
kono
parents: 156
diff changeset
3367 Intel Architecture だと、結構、良い線いっているみたい。
159
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3368
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3369 Thu Aug 14 02:39:29 JST 2003
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3370
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3371 done
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3372 [kono@pw001 ~/device]% time ./a.out 0
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3373 720
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3374 0.640u 0.000s 0:00.63 101.5% 0+0k 0+0io 88pf+0w
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3375 [kono@pw001 ~/device]% time ./a.out 1
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3376 719
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3377 0.720u 0.000s 0:00.71 101.4% 0+0k 0+0io 88pf+0w
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3378 [kono@pw001 ~/device]% time ./a.out 2
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3379 470
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3380 0.330u 0.000s 0:00.33 100.0% 0+0k 0+0io 88pf+0w
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3381 [kono@pw001 ~/device]% time ./a.out 3
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3382 720
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3383 0.370u 0.010s 0:00.37 102.7% 0+0k 0+0io 88pf+0w
b80e9737c3ce regs[creg]==0 in ia32
kono
parents: 158
diff changeset
3384
160
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3385
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3386 +jessica+kono time ./a.out 0
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3387 720
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3388 1.190u 0.010s 0:01.51 79.4% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3389 +jessica+kono time ./a.out 1
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3390 719
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3391 1.700u 0.000s 0:01.78 95.5% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3392 +jessica+kono time ./a.out 2
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3393 470
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3394 0.630u 0.000s 0:00.66 95.4% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3395 +jessica+kono time ./a.out 3
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3396 720
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3397 0.790u 0.000s 0:00.81 97.5% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3398 +jessica+kono time ./a.out 4
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3399 0.000u 0.000s 0:00.00 0.0% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3400
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3401 +jessica+kono gcc test/conv1.c
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3402 +jessica+kono time ./a.out 0
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3403 720
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3404 0.960u 0.000s 0:00.97 98.9% 0+0k 0+2io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3405 +jessica+kono gcc -O test/conv1.c
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3406 +jessica+kono time ./a.out 0
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3407 720
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3408 0.470u 0.000s 0:00.48 97.9% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3409 +jessica+kono gcc -O6 test/conv1.c
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3410 +jessica+kono time ./a.out 0
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3411 720
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3412 0.260u 0.000s 0:00.26 100.0% 0+0k 0+0io 0pf+0w
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3413
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3414 Mon Sep 1 13:49:43 JST 2003
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3415
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3416 short がやっぱり欲しいよね。long long はともかく...
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3417 そこまでいくと、ANSI-C 対応にできるんだが。long long
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3418 は難しい?
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3419
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3420 short は、そんなに難しくないはず。あとは、
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3421 statement を含めたtreeの処理
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3422 変換系の完成
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3423 この二つだな。GCC に組み込むのは無理だろう。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3424
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3425 属性文法みたいな手法が使えればね。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3426
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3427 あと、struct のtag。やっぱりword table を作り直さないと。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3428
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3429 Wed Sep 10 21:53:16 JST 2003
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3430
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3431 short や unsigned short の前に、
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3432 なんか unsigned char もないんですけど。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3433
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3434 Wed Oct 8 22:43:17 JST 2003
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3435
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3436 (また、一カ月、触ってないのか...)
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3437
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3438 無名 code はあった方がいいんじゃない?
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3439
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3440 code *a(int i);
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3441 a = code(int j) { }
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3442
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3443 みたいな感じ? C にはないけどね。もともと、名前を消費する
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3444 方だからあった方がいいかも。でも、実行時に作られるわけじゃない。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3445 それに、こういうものを作ると closure だと思われるような
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3446 気もする。closure みたいなものは「自分で管理する」ってのが
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3447 CbC の思想だろ?
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3448
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3449 そういえば、static なcodeはあった方がいいんじゃない?
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3450
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3451 static code func() { .... }
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3452
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3453 か。それはそうだな。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3454
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3455 Fri Oct 10 13:08:01 JST 2003
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3456
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3457 link register をうまく使うにはcontinuationに
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3458 指定するだけではダメで、
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3459 goto hoge(....,next);
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3460 code next..
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3461 みたいなのがあった方がいいんじゃない?
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3462
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3463 goto の後のステートメントは無名codeになればいいんだよね。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3464
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3465 stack を使わないサブルーチンみたいなものか。単なるcall
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3466 になるわけね。それもいいかも。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3467
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3468 Sat Nov 22 15:51:36 JST 2003
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3469
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3470 構造体のfieldの定義のnptrは、大域の名前テーブルから
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3471 取り除かないといけない。でも、取り除いていしまうと、
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3472 構造体からのポインタがずれちゃうので、まずい。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3473
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3474 filed専用の領域を作るのだと、複数の構造体が同じ
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3475 field名を持つときにちょっと困る。構造体のタイプに
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3476 埋め込むのがいいんだけど...
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3477
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3478 そうすると、構造体のfiledかどうかをgetsymがチェック
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3479 するときにちょっと困る。
1f440a2790fb *** empty log message ***
kono
parents: 159
diff changeset
3480
161
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3481 filed をlinear searchするのは嫌だけど、しかたないか。
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3482
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3483 なんか、struct の中に、
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3484 void (*case_)(int cases,int def);
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3485 とかがあると、
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3486 void (*case_)();
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3487 int cases;
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3488 int def;
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3489 という感じで余計なfieldが定義されてるみたい。
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3490
cc2fc5c0dfe5 struct field fix
kono
parents: 160
diff changeset
3491 adecl で nptr が引数の最後を指してしまうのがまずかった。
164
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3492
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3493 Mon Nov 24 00:52:31 JST 2003
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3494
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3495 signed char は実装しましたが... test routine がない。
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3496
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3497 あと、short は、code_crxxxx の中でbyteの大きさに従って
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3498 処理するのがいいかな。
1c2a9232ea93 mc.h generation
kono
parents: 161
diff changeset
3499