Advertisement
Guest User

ARM NEON example

a guest
Oct 1st, 2013
149
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.13 KB | None | 0 0
  1. #include <arm_neon.h>
  2. #include <stdio.h>
  3.  
  4. void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
  5. {
  6.   int i;
  7.   for (i=0; i<n; i++)
  8.   {
  9.     int r = *src++; // load red
  10.     int g = *src++; // load green
  11.     int b = *src++; // load blue
  12.  
  13.     // build weighted average:
  14.     int y = (r*77)+(g*151)+(b*28);
  15.  
  16.     // undo the scale by 256 and write to memory:
  17.     *dest++ = (y>>8);
  18.   }
  19. }
  20.  
  21. void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
  22. {
  23.   int i;
  24.   uint8x8_t rfac = vdup_n_u8 (77);
  25.   uint8x8_t gfac = vdup_n_u8 (151);
  26.   uint8x8_t bfac = vdup_n_u8 (28);
  27.   n/=8;
  28.  
  29.   for (i=0; i<n; i++)
  30.   {
  31.     uint16x8_t  temp;
  32.     uint8x8x3_t rgb  = vld3_u8 (src);
  33.     uint8x8_t result;
  34.  
  35.     temp = vmull_u8 (rgb.val[0],      rfac);
  36.     temp = vmlal_u8 (temp,rgb.val[1], gfac);
  37.     temp = vmlal_u8 (temp,rgb.val[2], bfac);
  38.  
  39.     result = vshrn_n_u16 (temp, 8);
  40.     vst1_u8 (dest, result);
  41.     src  += 8*3;
  42.     dest += 8;
  43.   }
  44. }
  45.  
  46. int main ()
  47. {
  48.   uint8_t src[] = {255, 0, 0,
  49.                    255, 127, 0,
  50.                    255, 255, 0,
  51.                    127, 255, 0,
  52.                    0, 255, 0,
  53.                    0, 255, 127,
  54.                    0, 255, 255,
  55.                    0, 127, 255,
  56.                    0, 0, 255,
  57.                    127, 0, 255,
  58.                    255, 0, 255,
  59.                    255, 0, 127,
  60.                    255, 0, 0,
  61.                    255, 127, 0,
  62.                    255, 255, 0,
  63.                    127, 255, 0,
  64.                    0, 255, 0,
  65.                    0, 255, 127,
  66.                    0, 255, 255,
  67.                    0, 127, 255,
  68.                    0, 0, 255,
  69.                    127, 0, 255,
  70.                    255, 0, 255,
  71.                    255, 0, 127};
  72.   uint8_t dst[24];
  73.  
  74.   int i;
  75.  
  76. // #define REFERENCE
  77.  
  78. #ifdef REFERENCE
  79.   for (i = 0; i < 1000000; ++i) {
  80.     reference_convert(dst, src, 24);
  81.   }
  82.  
  83.   puts("Reference");
  84. #else
  85.   for (i = 0; i < 1000000; ++i) {
  86.     neon_convert(dst, src, 24);
  87.   }
  88.  
  89.   puts("Neon");
  90. #endif
  91.  
  92.   for (i = 0; i < 24; ++i) {
  93.     printf("dst[%d]=%d\n", i, dst[i]);
  94.   }
  95.  
  96.   return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement