ARM NEONの128bit演算とgcc(1)

2015/06/07Raspberry Pi, プログラミング

128bit単位のbit演算をARM+gccで書くためのメモ。



gcc Intrinsics

gcc の拡張命令で直接書ける。

gcc の vectorize

arm_neon.h を include して vectorize オプションを効かせる。

#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;
}

“-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