吉田/日誌/2009-03-09
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
単語検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
[[吉田>吉田]]/[[日誌>吉田/日誌]]
&size(18){ぬ。};
>''[[パルテノンなアレ>第14回ASICデザインコンテスト]]''
現状改良案(2009年3月9日-15:23)
-[[復習と改良案(Pico16o)>吉田/覚書/復習と改良案(Pico16o)]]
-コンパイラ側で乗、除算処理を可能にしてみる。
--シフト演算でなんとか。除算は変数x定数時も変数x変数時と同様に処理しなくてはかもしれない。
-メモリが8bitまでしか認識しないというかPC処理してくれないので16bit拡張を要請。
--8bitだとコード肥大化時に無限ループ突入。
-ループと再帰の展開。
--停滞してるねぇ。
-アセンブラ生成後の処理順序最適化。
--Perlかナニかでナンとか。
a=32;
b=a+8;
が、
ldli r1, #32
ldli r0, #1
st (r0), r1
ld r2, (r0) <ここのldが無駄。mv r2, r1 でいいはず。
addi r2, #8
ldli r0, #2
st (r0), r2
とか、その他諸々に適用可かと。
今日の足掻き(主に体調的な意味で)
-マスクが手放せない。
今日の成果。
- 変数同士の乗算を完成(暫定) -- &new{2009-03-09 (月) 17:14:06};
--公開プログラムでは欠片も効果無し。
reg = ex(p->opr.op[0], 0);
regx = ex(p->opr.op[1], 0);
comment("除算(変数同士)");
iinst("ldli", 1, 0x0);
if(reg!=3 && regx==4){
rinst2("mv", 3, reg);
}
else if(reg==3 && regx!=4){
rinst2("mv", 4, regx);
}
else if(reg!=3 && regx==3){
rinst2("mv", 4, regx);
rinst2("mv", 3, reg);
}
else{
rinst2("mv", 3, reg);
rinst2("mv", 4, regx);
}
printf("L%03d:\n", lbl1 = lbl++);
binst("beqz", 4, lbl2 = lbl++);
rinst2("mv", 5, 4);
iinst("andi", 5, 0x1);
binst("beqz", 5, lbl3 = lbl++);
rinst2("add", 1, 3);
printf("L%03d:\n", lbl3);
rinst2("sl", 3, 3);
rinst2("sr", 4, 4);
jinst("jmp", lbl1);
printf("L%03d:\n", lbl2);
rinst2("mv", reg, 1);
return reg;
- 除算完成。定数と変数の式はまた後で。 -- &new{2009-03-09 (月) 18:33:58};
--乗算に同じく公開プログラムでは欠片も効果無し。
case '/':
reg = ex(p->opr.op[0], 0);
regx = ex(p->opr.op[1], 0);
comment("除算");
iinst("ldli", 1, 0x0);
if(reg!=3 && regx==4){
rinst2("mv", 3, reg);
}
else if(reg==3 && regx!=4){
rinst2("mv", 4, regx);
}
else if(reg!=3 && regx==3){
rinst2("mv", 4, regx);
rinst2("mv", 3, reg);
}
else{
rinst2("mv", 3, reg);
rinst2("mv", 4, regx);
}
printf("L%03d:\n", lbl1 = lbl++);
rinst2("sub", 3, 4);
binst("bmi", 3, lbl2 = lbl++);
iinst("addi", 1, 1);
jinst("jmp", lbl1);
printf("L%03d:\n", lbl2);
return 1;
- 今まで「定数 演算子 変数」が知らずエラーだったのを修正。右優先結合指定で解決。 -- &new{2009-03-09 (月) 18:40:26};
--例外発生で解決ならず。ぎゃーす。
- アセンブラ生成後の処理順序最適化。なんとなくPerlでコメントを消したりしてた(無意味)が、文字列置換がうまくいってない。寝る。 -- &new{2009-03-09 (月) 22:31:06};
- 一応置換成功。試しにPOPx2をPOPとmvに。てかもう寝るってばよ! -- &new{2009-03-09 (月) 23:00:16};
- Perlで配列の任意の位置に要素挿入する方法ってなんだったか、、、それさえあれば遅延スロットいけそうなんだが。毎回配列作りなおすとか? 死。あといまのとこコメントは全滅。置場が見付かったら退避してあとで復帰。寝れ。 -- &new{2009-03-09 (月) 23:07:17};
__________________________________________________________________________________
#comment
終了行:
[[吉田>吉田]]/[[日誌>吉田/日誌]]
&size(18){ぬ。};
>''[[パルテノンなアレ>第14回ASICデザインコンテスト]]''
現状改良案(2009年3月9日-15:23)
-[[復習と改良案(Pico16o)>吉田/覚書/復習と改良案(Pico16o)]]
-コンパイラ側で乗、除算処理を可能にしてみる。
--シフト演算でなんとか。除算は変数x定数時も変数x変数時と同様に処理しなくてはかもしれない。
-メモリが8bitまでしか認識しないというかPC処理してくれないので16bit拡張を要請。
--8bitだとコード肥大化時に無限ループ突入。
-ループと再帰の展開。
--停滞してるねぇ。
-アセンブラ生成後の処理順序最適化。
--Perlかナニかでナンとか。
a=32;
b=a+8;
が、
ldli r1, #32
ldli r0, #1
st (r0), r1
ld r2, (r0) <ここのldが無駄。mv r2, r1 でいいはず。
addi r2, #8
ldli r0, #2
st (r0), r2
とか、その他諸々に適用可かと。
今日の足掻き(主に体調的な意味で)
-マスクが手放せない。
今日の成果。
- 変数同士の乗算を完成(暫定) -- &new{2009-03-09 (月) 17:14:06};
--公開プログラムでは欠片も効果無し。
reg = ex(p->opr.op[0], 0);
regx = ex(p->opr.op[1], 0);
comment("除算(変数同士)");
iinst("ldli", 1, 0x0);
if(reg!=3 && regx==4){
rinst2("mv", 3, reg);
}
else if(reg==3 && regx!=4){
rinst2("mv", 4, regx);
}
else if(reg!=3 && regx==3){
rinst2("mv", 4, regx);
rinst2("mv", 3, reg);
}
else{
rinst2("mv", 3, reg);
rinst2("mv", 4, regx);
}
printf("L%03d:\n", lbl1 = lbl++);
binst("beqz", 4, lbl2 = lbl++);
rinst2("mv", 5, 4);
iinst("andi", 5, 0x1);
binst("beqz", 5, lbl3 = lbl++);
rinst2("add", 1, 3);
printf("L%03d:\n", lbl3);
rinst2("sl", 3, 3);
rinst2("sr", 4, 4);
jinst("jmp", lbl1);
printf("L%03d:\n", lbl2);
rinst2("mv", reg, 1);
return reg;
- 除算完成。定数と変数の式はまた後で。 -- &new{2009-03-09 (月) 18:33:58};
--乗算に同じく公開プログラムでは欠片も効果無し。
case '/':
reg = ex(p->opr.op[0], 0);
regx = ex(p->opr.op[1], 0);
comment("除算");
iinst("ldli", 1, 0x0);
if(reg!=3 && regx==4){
rinst2("mv", 3, reg);
}
else if(reg==3 && regx!=4){
rinst2("mv", 4, regx);
}
else if(reg!=3 && regx==3){
rinst2("mv", 4, regx);
rinst2("mv", 3, reg);
}
else{
rinst2("mv", 3, reg);
rinst2("mv", 4, regx);
}
printf("L%03d:\n", lbl1 = lbl++);
rinst2("sub", 3, 4);
binst("bmi", 3, lbl2 = lbl++);
iinst("addi", 1, 1);
jinst("jmp", lbl1);
printf("L%03d:\n", lbl2);
return 1;
- 今まで「定数 演算子 変数」が知らずエラーだったのを修正。右優先結合指定で解決。 -- &new{2009-03-09 (月) 18:40:26};
--例外発生で解決ならず。ぎゃーす。
- アセンブラ生成後の処理順序最適化。なんとなくPerlでコメントを消したりしてた(無意味)が、文字列置換がうまくいってない。寝る。 -- &new{2009-03-09 (月) 22:31:06};
- 一応置換成功。試しにPOPx2をPOPとmvに。てかもう寝るってばよ! -- &new{2009-03-09 (月) 23:00:16};
- Perlで配列の任意の位置に要素挿入する方法ってなんだったか、、、それさえあれば遅延スロットいけそうなんだが。毎回配列作りなおすとか? 死。あといまのとこコメントは全滅。置場が見付かったら退避してあとで復帰。寝れ。 -- &new{2009-03-09 (月) 23:07:17};
__________________________________________________________________________________
#comment
ページ名: