a25_buntan05
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
]
開始行:
* buntan-pc #5
-(by [[K]], 2025.06.11)
** (0)
-https://github.com/buntan-pc/
-これにかかわる開発の話
** 2025.06.13 Fri #0
-buntan-pcのCPUについて勉強したいっ!
-[Q]っていうか今まで、分からないままアセンブラ作ってたの?
-[A]ええそうなんです。仕様書やサンプルのアセンブラがよく...
-まずここを見る。 https://github.com/buntan-pc/buntan-pc/...
-たぶんfpがフレームポインタでローカル変数を置けばいいと思...
-gpはグローバル変数を置けばいいと思う。
-ということは、kharcをこのCPUでやるとしたらこうかな?
R0:[gp+0], R1:[gp+2], R2:[gp+4], R3:[gp+6],
A0:[gp+8], A1:[gp+10], A2:[gp+12], RP:[gp+14], SP:fp
-そうすると、こうすればいいかな?
LodRMd(R0,SP,8); → LD fp+8; ST gp+0;
StoRMd(R1,SP,12); → LD gp+2; ST fp+12;
AddRI(R2,3); → LD gp+4; PUSH 3; ADD; ST gp+4;
CmpJneRII(R0,0,lb); → LD gp+0; NOT; JZ xxx;
-[Q]x86と違って、kharcの1命令がbuntan-pcの2命令とかになっ...
-[A]スタックマシンなのでしょうがない。たとえ命令数が2倍で...
-まあレジスタマシンで32bitのやつがあればいいなーとは思う...
** 2025.06.14 Sat #0
-[Q]スタックトップの値をR0にすればいいんじゃないの?
-[A]それは一案なのだけど、もしR0の値をどこかにSTしたら、R...
-[Q]いやでもさ、R0をどこかに書き込む命令があったとして、...
-[A]それもそうだなあ。じゃあfibどうなるかやってみよう。
-以下ではintのサイズが4バイトのままになっているけど、これ...
LbI(9); // fib()
SubAI(SP,24); ADD fp,-24;
StoAMd(RP,SP,20); (なし) // あえてRPの管...
LodRMd(R0,SP,24); LD fp+24;
CgtRI(R0,1); PUSH 1; LE; NOT; // GT命令がない...
StoRMd(R0,SP,8); (無視) // ムダ命令なの...
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
CmpJeqRII(R0,0,12); NOT; JZ xxx; // これはNOTが...
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,2); PUSH 2; SUB;
StoRMd(R0,SP,8); (無視)
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
StoRMd(R0,SP,0); ST fp+0; // これはDUPす...
CalII(9,10); CALL xxx;
StoRMd(R0,SP,8); ST fp+8; // 次にR0へのLo...
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,1); PUSH 1; SUB; // INCやINC2が...
StoRMd(R0,SP,12); (無視)
LodRMd(R0,SP,12); (無視)
FreI(12); (無視)
StoRMd(R0,SP,0); ST fp+0; // Cal直前なの...
CalII(9,11); CALL xxx;
StoRMd(R0,SP,12); ST fp+12; // 次にR0へのLo...
LodRMd(R0,SP,8); LD fp+8;
LodRMd(R1,SP,12); LD fp+12; ST gp+2;
AddRR(R0,R1); LD gp+2; ADD; // この時、ST ...
StoRMd(R0,SP,16); (無視)
FreI(8); (無視)
FreI(12); (無視)
LodRMd(R0,SP,16); (無視)
StoRMd(R0,SP,24); ST fp+24; // 次にR0へのLo...
FreI(16); (無視)
LbI(12);
LodRMd(R0,SP,24); LD fp+24;
JmpI(13); (無視)
LbI(13); // fib().ret: (無視)
LodAMd(RP,SP,20); (なし)
AddAI(SP,24); ADD fp,24
Ret(); RET
-なんとこのルールなら無駄なDUPを生成することは一度もなか...
-uchanさんのCコンパイラでコード生成したときと大差ない気が...
-これ書いてわかった。Cal/RetでRPを使わないモードにするな...
-そうだな、それで十分だ。これに従わないのなら、CPUの機能...
-ポインタとか使い始めてA0とかA1とかが出てきたら大変なこと...
-GTやGEがないのは不便そうだなーって思ったけど、直前2つのP...
-JNZがなくても平気っていうのもたぶん同じ理由だな。・・・...
-今頃になって気づいたけど、fib(20)ってやったら、fib(i-1)...
-x86に対してもRP使わないモードっていうのはありだと思う。...
** 2025.06.14 Sat #1
-これのbuntan-pc用のアセンブラ出力を作ってuchanさんに相談...
int main() { return fib(10); }
int fib(int i) { if (i > 1) { i = fib(i - 2) + fib(i - 1...
-余裕だぜ!
-x86のJITコンパイラでRPを使わないでCALL(e8)/RET(c3)で実行...
-uchanさんにアピールすることを考えると、まずやるべきは最...
-uccはまだ構造体をサポートしてないっぽいので、それをやれ...
終了行:
* buntan-pc #5
-(by [[K]], 2025.06.11)
** (0)
-https://github.com/buntan-pc/
-これにかかわる開発の話
** 2025.06.13 Fri #0
-buntan-pcのCPUについて勉強したいっ!
-[Q]っていうか今まで、分からないままアセンブラ作ってたの?
-[A]ええそうなんです。仕様書やサンプルのアセンブラがよく...
-まずここを見る。 https://github.com/buntan-pc/buntan-pc/...
-たぶんfpがフレームポインタでローカル変数を置けばいいと思...
-gpはグローバル変数を置けばいいと思う。
-ということは、kharcをこのCPUでやるとしたらこうかな?
R0:[gp+0], R1:[gp+2], R2:[gp+4], R3:[gp+6],
A0:[gp+8], A1:[gp+10], A2:[gp+12], RP:[gp+14], SP:fp
-そうすると、こうすればいいかな?
LodRMd(R0,SP,8); → LD fp+8; ST gp+0;
StoRMd(R1,SP,12); → LD gp+2; ST fp+12;
AddRI(R2,3); → LD gp+4; PUSH 3; ADD; ST gp+4;
CmpJneRII(R0,0,lb); → LD gp+0; NOT; JZ xxx;
-[Q]x86と違って、kharcの1命令がbuntan-pcの2命令とかになっ...
-[A]スタックマシンなのでしょうがない。たとえ命令数が2倍で...
-まあレジスタマシンで32bitのやつがあればいいなーとは思う...
** 2025.06.14 Sat #0
-[Q]スタックトップの値をR0にすればいいんじゃないの?
-[A]それは一案なのだけど、もしR0の値をどこかにSTしたら、R...
-[Q]いやでもさ、R0をどこかに書き込む命令があったとして、...
-[A]それもそうだなあ。じゃあfibどうなるかやってみよう。
-以下ではintのサイズが4バイトのままになっているけど、これ...
LbI(9); // fib()
SubAI(SP,24); ADD fp,-24;
StoAMd(RP,SP,20); (なし) // あえてRPの管...
LodRMd(R0,SP,24); LD fp+24;
CgtRI(R0,1); PUSH 1; LE; NOT; // GT命令がない...
StoRMd(R0,SP,8); (無視) // ムダ命令なの...
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
CmpJeqRII(R0,0,12); NOT; JZ xxx; // これはNOTが...
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,2); PUSH 2; SUB;
StoRMd(R0,SP,8); (無視)
LodRMd(R0,SP,8); (無視)
FreI(8); (無視)
StoRMd(R0,SP,0); ST fp+0; // これはDUPす...
CalII(9,10); CALL xxx;
StoRMd(R0,SP,8); ST fp+8; // 次にR0へのLo...
LodRMd(R0,SP,24); LD fp+24;
SubRI(R0,1); PUSH 1; SUB; // INCやINC2が...
StoRMd(R0,SP,12); (無視)
LodRMd(R0,SP,12); (無視)
FreI(12); (無視)
StoRMd(R0,SP,0); ST fp+0; // Cal直前なの...
CalII(9,11); CALL xxx;
StoRMd(R0,SP,12); ST fp+12; // 次にR0へのLo...
LodRMd(R0,SP,8); LD fp+8;
LodRMd(R1,SP,12); LD fp+12; ST gp+2;
AddRR(R0,R1); LD gp+2; ADD; // この時、ST ...
StoRMd(R0,SP,16); (無視)
FreI(8); (無視)
FreI(12); (無視)
LodRMd(R0,SP,16); (無視)
StoRMd(R0,SP,24); ST fp+24; // 次にR0へのLo...
FreI(16); (無視)
LbI(12);
LodRMd(R0,SP,24); LD fp+24;
JmpI(13); (無視)
LbI(13); // fib().ret: (無視)
LodAMd(RP,SP,20); (なし)
AddAI(SP,24); ADD fp,24
Ret(); RET
-なんとこのルールなら無駄なDUPを生成することは一度もなか...
-uchanさんのCコンパイラでコード生成したときと大差ない気が...
-これ書いてわかった。Cal/RetでRPを使わないモードにするな...
-そうだな、それで十分だ。これに従わないのなら、CPUの機能...
-ポインタとか使い始めてA0とかA1とかが出てきたら大変なこと...
-GTやGEがないのは不便そうだなーって思ったけど、直前2つのP...
-JNZがなくても平気っていうのもたぶん同じ理由だな。・・・...
-今頃になって気づいたけど、fib(20)ってやったら、fib(i-1)...
-x86に対してもRP使わないモードっていうのはありだと思う。...
** 2025.06.14 Sat #1
-これのbuntan-pc用のアセンブラ出力を作ってuchanさんに相談...
int main() { return fib(10); }
int fib(int i) { if (i > 1) { i = fib(i - 2) + fib(i - 1...
-余裕だぜ!
-x86のJITコンパイラでRPを使わないでCALL(e8)/RET(c3)で実行...
-uchanさんにアピールすることを考えると、まずやるべきは最...
-uccはまだ構造体をサポートしてないっぽいので、それをやれ...
ページ名: