mootoh.iphone.dev

 | 

2009-10-30

neon 命令を Xcode で使う

| 12:52 | はてなブックマーク - neon 命令を Xcode で使う - mootoh.iphone.dev

iPhone 3GS / touch 3G では、ARMNEON SIMD 命令が使えて胸がときめきます。ほんの少し設定すれば Xcode からもつかえる。

  1. ターゲットを ``Device'' に
  2. #include <arm_neon.h>
  3. プロジェクトの設定で、アーキテクチャを ``armv7'' に手書き、最適化を ``-O3'' に、 thumb 命令をオフに

http://gyazo.com/d12248810af88126f7d9defe20eef0be.png

"-march=armv7-a -mtune=cortex-a8 -mfloat-abi=softfp -mfpu=neon" を CFLAGS につけないといけないかなーと思ってたんですが、つけたのとついてないのとで、吐かれるアセンブリが変わらないんですよね。なぞ。もっと複雑な SIMD 書くと違ってくるのかも。要追求。

iPhone 3GS か touch 3G な実機でしか動きません。

gist: 222087 - sum by ARM NEON- GitHub

- (void) sum
{
   uint4 x = {0,1,2,3};
   uint4 y = {4,5,6,7};
   //uint4 result = x + y;
   uint4 result = vaddq_u32(x, y);

   uint32_t a = *(uint32_t *)&result;
   uint32_t b = *((uint32_t *)&result +1);
   uint32_t c = *((uint32_t *)&result +2);
   uint32_t d = *((uint32_t *)&result +3);
   
   NSLog(@"result = (%u,%u,%u,%u)", a, b, c, d); // -> result = (4,6,8.10)
}

結果:

%  /Developer/Platforms/iPhoneOS.platform/Developer/usr/bin/otool -tV build/neon_01.build/Release-iphoneos/neon_01.build/Objects-normal/armv7/neon_01AppDelegate.o

....
-[neon_01AppDelegate sum]:
0000007c            b580        push    {r7, lr}
0000007e            af00        add     r7, sp, #0
00000080            b085        sub     sp, #20
00000082        ed9f4b0c        vldr    d4, [pc, #48]   ; 0xb6
00000086        ed9f5b0d        vldr    d5, [pc, #52]   ; 0xbe
0000008a        ed9f6b0e        vldr    d6, [pc, #56]   ; 0xc6
0000008e        ed9f7b0f        vldr    d7, [pc, #60]   ; 0xce
00000092        ef266844        vadd.i32        q3, q3, q2
00000096        ed8d6b01        vstr    d6, [sp, #4]
0000009a        ed8d7b03        vstr    d7, [sp, #12]
....
 |