#include "osecpu_ask.h" #define L_func LOCAL(0) LOCALLABELS(1); #define func(x) P31 = x; CALL(L_func) // main do { VPtr p:P01; junkApi_malloc(p, T_VPTR, 1); // PSMEM0(P28, T_VPTR, p); func(p); R23 += 0x23; } beginFunc(L_func); do { R20 += 0x20; PLMEM0(P21, T_VPTR, P31); R22 += 0x22; } endFunc();上に貼り付けたプログラムをosecpu074dで実行すると、R20=0x20、P21=null、R22=0x22、R23=0x23と期待通りの結果を得ました。 ここでPSMEM0の行を有効にして実行すると、P21=P28だけが変化すると期待していますが、P21=P28のほかにP22=0も変化してしまいます。 どうやらPSMEM0の行が有効ならば、PLMEM0以降の命令は実行されずにfuncから帰るようです。 かなり不可解な挙動なのでこれはバグではないでしょうか? -- yao 2013-09-12 (木) 22:42
#include "osecpu_ask.h" junkApi_malloc(P01, T_VPTR, 1); PSMEM0(P28, T_VPTR, P01); PLMEM0(P01, T_VPTR, P01);上のプログラムをosecpu076dで実行するとP01に不正なポインタが入ります。P01=P28であっても、PLMEMの両オペランドが一致してはならないという仕様でも、どちらでも納得はできます。 -- yao 2013-09-14 (土) 22:59
#include "osecpu_ask.h" #define L_func LOCAL(0) #define L_func2 LOCAL(1) LOCALLABELS(2); CALL(L_func2); beginFunc(L_func); endFunc(); beginFunc(L_func2); endFunc();上のプログラムをosecpu076dで実行しようとすると「JITC: label not defined」とエラーが発生します。a_4ose.oseのダンプとdebug:2オプションで得られるdebug2.binのダンプを読み比べると、後者からはfunc2の定義が失われてしまっています。当然、ラベルは定義されません。このバグは9個目の関数を書いたときに見つけましたが、起きる条件はまだ分かりません。回避方法があればそちらも教えていただきたいです。 -- yao 2013-09-17 (火) 03:38
#include "osecpu_ask.h" DB(0x03,0x81-0x40); DDBE(0); junkApi_fopenRead(R00, P01, 1);関数jitCompilerでPLIMMをコンパイルする際にレジスタの番号をチェックしていないため、構造体Regsのポインタレジスタより高位のメモリ領域を破壊できてしまうことが原因だと思われます。 -- yao 2014-03-31 (月) 14:01:15
たとえばこんな状況: R00に0x12、R01に0x34が入っている。R00とR01はどちらもbit=32。これらを足し合わせて、下位4ビットだけがほしい。 これには2つの書き方がある。 (1) ADD(32, R02, R00, R01); LIMM(4, R3F, 0x0f); AND(4, R02, R02, R3F); (2) PREFIX_2F(0); ADD(4, R02, R00, R01); LIMM(4, R3F, 0x0f); AND(4, R02, R02, R3F); 1のやり方はプレフィクスがいらないけど、ADDは32ビットで演算している。これは必要のない精度の計算だといえる。 無駄な書き方を「強要」しなければいけないとしたら、それは本当に「いい仕様」といえるだろうか? それに対して2は不要な演算は全くない。
コメント | お名前 | NameLink | |