SSブログ

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_TEXTSEG_CONST それぞれで global2個以上にならないように 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やリンクしないように注意が要る)

*1:
tasm32 は public 名毎に PUBDEF を作成するようだが、他のアセンブラは、セグメント毎の PUBDEF に複数の public 名を入れるようだ。
*2:

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 で何故かエラーになるようだ。)


nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

※ブログオーナーが承認したコメントのみ表示されます。

トラックバック 0