今日の作業
5:19
gas/config/tc-arm.c の解読。
結論から言うと、WLDR/WSTRではレジスタ(Rm)によるプリ/ポストインデックスは使えない。
static void encode_arm_addr_mode_2 (int i, bfd_boolean is_t) { encode_arm_addr_mode_common (i, is_t); if (inst.operands[i].immisreg) { inst.instruction |= INST_IMMEDIATE; /* yes, this is backwards */ inst.instruction |= inst.operands[i].imm;
LDR r0, [r1], r2 のように書いた場合、inst.operands[i].immisreg=1、inst.operands[i].imm=2(r2)になる。んで、immisreg=1の場合、INST_IMMEDIATEをORしていて
#define INST_IMMEDIATE 0x02000000
それはこんなふうに定義されてる。しかし、WSTRのエンコーディングはこう。
31 30 29 28 | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 19 18 17 16 | 15 14 13 12 | 11 | 10 | 9 | 8 | 7 6 5 4 3 2 1 0 |
Cond | 1 | 1 | 0 | P | U | N | W | 0 | Rn | wRm | 0 | 0 | 0 | M | offset_8 |
ビット25が0固定になってる。よって、オフセットには8ビットの即値しか使えない、と。
betaplayerのコードも眺めてみたけど、この結論であってるみたい。
7:08
% cumulative self self total time seconds seconds calls s/call s/call name 23.94 106.24 106.24 mcount_internal 7.39 139.03 32.79 22177272 0.00 0.00 mpeg4_decode_block
とまぁ、gprofの関数を除くと処理時間トップに君臨するmpeg4_decode_block。とりあえず一箇所ほど最適化出来そうな場所を発見した。どんなプロセッサでもクソ遅い除算を乗算に変える方法で、既にx86用のコードはある。ARMまたはiWMMXtで似たことが出来ないか模索中。
11:33
いつのまにかRL_XQが音声ありで完璧に再生出来るようになってた。でも、-framedropを追加すると重いシーンでガビガビになる。んで、最近知った -autosync 100 も追加したら、フレームドロップ無しと同じぐらい滑らかに再生出来るようになった。これはZPlayerのデフォルトオプションに追加しとこう。
Playing /mnt/card/RL_XQ_640x480_1500_128.avi. AVI file format detected. VIDEO: [XVID] 640x480 24bpp 24.000 fps 1478.8 kbps (180.5 kbyte/s) AUDIO: 44100 Hz, 2 ch, s16le, 128.0 kbit/9.07% (ratio: 16000->176400) BENCHMARKs: VC: 106.917s VO: 0.423s A: 10.066s Sys: 33.071s = 150.477s BENCHMARK%: VC: 71.0522% VO: 0.2810% A: 6.6892% Sys: 21.9776% = 100.0000% BENCHMARKn: disp: 3609 (23.98 fps) drop: 12 (0%) total: 3621 (24.06 fps)
もう十分なんじゃないかって気がしてきた。:)