ARM NEONの128bit演算とgcc(1)
128bit単位のbit演算をARM+gccで書くためのメモ。
gcc Intrinsics
gcc の拡張命令で直接書ける。
gcc の vectorize
arm_neon.h を include して vectorize オプションを効かせる。
[code lang="C"]
#include <arm_neon.h>int main()
{
uint32x4_t mm0={1,2,3,4};
uint32x4_t mm1={5,6,7,8};
uint32x4_t mm2;mm2=mm0&mm1;
mm2=mm0|mm1;
mm2=mm0^mm1;
mm2=~mm0;
mm2=mm0&~mm1;
mm2&=mm0;return 0;
}
[/code]
“-O" すると最適化されて全部無くなってしまうので、付けずにコンパイル。使用機器はraspberry PI2。
$ g++-4.8 -W -Wall -D_GCC_ -std=gnu++11 -mcpu=cortex-a7 -mfpu=neon-vfpv4 -mfloat-abi=hard -mvectorize-with-neon-quad -ffast-math -ftree-vectorizer-verbose=9 -I ../build-aux/ -O -S test1.cpp
and,or,xor,not は vand,vor,veor,vmvn にコンパイルされる。
and-not は vbic になって欲しいが素直にand-notになっている。最適化効かせたらvbicになるのかな?
and-not だけoperator overloadすれば用は足りそう。
main: .fnstart .LFB1874: @ args = 0, pretend = 0, frame = 48 @ frame_needed = 1, uses_anonymous_args = 0 @ link register save eliminated. str fp, [sp, #-4]! add fp, sp, #0 sub sp, sp, #52 vldr d16, .L3 vldr d17, .L3+8 vstr d16, [fp, #-20] vstr d17, [fp, #-12] vldr d16, .L3+16 vldr d17, .L3+24 vstr d16, [fp, #-36] vstr d17, [fp, #-28] vldr d18, [fp, #-20] vldr d19, [fp, #-12] vldr d16, [fp, #-36] vldr d17, [fp, #-28] vand q8, q9, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] vldr d18, [fp, #-20] vldr d19, [fp, #-12] vldr d16, [fp, #-36] vldr d17, [fp, #-28] vorr q8, q9, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] vldr d18, [fp, #-20] vldr d19, [fp, #-12] vldr d16, [fp, #-36] vldr d17, [fp, #-28] veor q8, q9, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] vldr d16, [fp, #-20] vldr d17, [fp, #-12] vmvn q8, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] vldr d16, [fp, #-36] vldr d17, [fp, #-28] vmvn q9, q8 vldr d16, [fp, #-20] vldr d17, [fp, #-12] vand q8, q9, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] vldr d18, [fp, #-52] vldr d19, [fp, #-44] vldr d16, [fp, #-20] vldr d17, [fp, #-12] vand q8, q9, q8 vstr d16, [fp, #-52] vstr d17, [fp, #-44] mov r3, #0 mov r0, r3 sub sp, fp, #0 @ sp needed ldr fp, [sp], #4 bx lr
ディスカッション
コメント一覧
まだ、コメントがありません