Turbo C++ 2006 Explorer (7) - TJPEGの高速化(2) [パソコン/ソフト]
前回は、jpeg.pasで{$L}
を使用せず、fread
等も自前で用意する方法だったが、今回は普通にjpeg.pasで{$L}
やfread
等を使用する。
jpeg.pas で {$L}
が要る .obj ファイル:
jdapimin.obj jmemmgr.obj jmemnobs.obj jdinput.obj jdatasrc.obj jdapistd.obj jdmaster.obj jdphuff.obj jdhuff.obj jdcolor.obj jquant1.obj jquant2.obj jdmainct.obj jdcoefct.obj jdpostct.obj jdsample.obj jddctmgr.obj jidctflt.obj jidctfst.obj jidctint.obj jidctred.obj jdmarker.obj jutils.obj jcomapi.obj jdmerge.obj jdatadst.obj jcparam.obj jcapistd.obj jcapimin.obj jcinit.obj jcmarker.obj jcmaster.obj jcmainct.obj jcprepct.obj jccoefct.obj jccolor.obj jcsample.obj jcdctmgr.obj jcphuff.obj jfdctint.obj jfdctfst.obj jfdctflt.obj jchuff.obj jccolmmx.obj jccolss2.obj jcqnt3dn.obj jcqntflt.obj jcqntint.obj jcqntmmx.obj jcqnts2f.obj jcqnts2i.obj jcqntsse.obj jcsammmx.obj jcsamss2.obj jdcolmmx.obj jdcolss2.obj jdmermmx.obj jdmerss2.obj jdsammmx.obj jdsamss2.obj jf3dnflt.obj jfmmxfst.obj jfmmxint.obj jfss2fst.obj jfss2int.obj jfsseflt.obj ji3dnflt.obj jimmxfst.obj jimmxint.obj jimmxred.obj jiss2flt.obj jiss2fst.obj jiss2int.obj jiss2red.obj jisseflt.obj jsimdcpu.obj jsimdw32.obj
Turbo C++™ 2006 Explorer では、 jpeg.pas の {$L}
で色々な現象が起きる。
- ファイルフォーマットに問題があると表示される。
- 使用しているはずの変数が使用されていないと表示される。
- jpeg.obj のリンク時にエラーになる。
- jsimdext.inc の
SEG_TEXT
定義の.text
を_TEXT
にして、SEG_CONST
定義の.data
を_DATA
にすると治まる。 - 関数/手続きが見つからないと表示される。
-
{$L}
の順番を適当に変えると治まる。古い版のDelphi®の場合は、NASM が出力したOBJの PUBDEF レコードに2個以上の public 名があっても、1番目の public 名しか見ないので、順番の変更では解決しない(*1)。例外が起こる(環境によってはブルースクリーンになる)こともある。
public 名が1個ずつになるように PUBDEF を分割すると、「見つからない」表示や例外の発生は無くなったので、- PUBDEF を分割するツールを使用する。
- ASMファイルの
SEG_TEXT
やSEG_CONST
それぞれでglobal
が2個以上にならないように ASMソースを分割する。 - NASM を改造する(*2)。
の何れかが良いかもしれない。
(C++Builder® 用にHPPファイルを作成するように指示すると例外が起きる現象は解決できなかった)
{$L}
方式は、jpeg.objを作成してしまえばプロジェクトに色々追加しなくても、jpeg.pasのコンパイルで作成されたjpeg.hppをincludeして、jpeg.objにリンカのOBJ検索パスを通しておけば良いので楽だ。今は{$L}
方式を使用している。
アレになるが、jconsts.pasの resourcestring
をjpeg.pasに移してjpeg.pasのみを使用するようにした(jpeg.pasの uses JConsts;
は削除)。
(最初からあるjpeg.hppとjpeg.objファイルはそのままにしてある。誤ってそれらにincludeやリンクしないように注意が要る)
NASM の 2.02~2.03版(安定版)の場合、 outobj.c の 、
1991: obj_commit(orp); 1992: } 1993: obj_emit(orp); 1994: } 1995: orp->parm[0] = 0;
1991~1993行を、
* 1991: obj_emit2(orp);
* 1992:
* 1993: }
1994: }
1995: orp->parm[0] = 0;
にすると良いようだ。obj_emit2
がアレだという時は、
1991: obj_commit(orp); * 1992: obj_emit(orp); * 1993: } 1994: } 1995: orp->parm[0] = 0;
としても良いだろう。
2.04版以降は、outobj.c 内を orp->parm[0] = 0;
で検索すると良いかもしれない。
(NASM 0.98.39版の outobj.c の場合は、1988~1990行。0.99.03~2.01版は、MMXレジスタへの qword prefix付 paddd で何故かエラーになるようだ。)
コメント 0