iOS 6プロジェクトでは、ルックアップテーブルを介して4バイトワード(32ビット)に変換する必要がある2バイトワード(16ビット)を含むバッファーがあります。値をテーブルにハードコーディングしてから、2バイトのバッファーの値を使用して、取得する32ビットのテーブル値を決定します。次に例を示します。
void map_values(uint32_t *dst,uint16_t *src,uint32_t *lut,int buf_length){
int i=0;
for(i=0;i<buf_length;i++){
*dst = *(lut+(*src));
dst++;
src++;
}
}
問題は、それが遅すぎるということです。NEONを使用して一度に4つの出力バイトを処理することでこれを高速化できますか?問題は、srcバッファーから値を取得し、それをルックアップテーブルへの入力として使用して、取得する値を把握する方法に自信がないことです。また、ワード長はテーブルと出力バッファで同じですが、ソースでは同じではありません。したがって、必要な4つの32ビットワード出力に対して、入力として2つの16ビットワードしか読み取ることができません。何か案は?おそらく、この問題に取り組むためのより良い方法はありますか?
clangからの現在のasm出力(clang -O3 -arch armv7 lut.c -S):
.section __TEXT,__text,regular,pure_instructions
.section __TEXT,__textcoal_nt,coalesced,pure_instructions
.section __TEXT,__const_coal,coalesced
.section __TEXT,__picsymbolstub4,symbol_stubs,none,16
.section __TEXT,__StaticInit,regular,pure_instructions
.syntax unified
.section __TEXT,__text,regular,pure_instructions
.globl _map_values
.align 2
.code 16 @ @map_values
.thumb_func _map_values
_map_values:
@ BB#0:
cmp r3, #0
it eq
bxeq lr
LBB0_1: @ %.lr.ph
@ =>This Inner Loop Header: Depth=1
ldrh r9, [r1], #2
subs r3, #1
ldr.w r9, [r2, r9, lsl #2]
str r9, [r0], #4
bne LBB0_1
@ BB#2: @ %._crit_edge
bx lr
.subsections_via_symbols