Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <arm_neon.h>
- #include <stdio.h>
- void reference_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
- {
- int i;
- for (i=0; i<n; i++)
- {
- int r = *src++; // load red
- int g = *src++; // load green
- int b = *src++; // load blue
- // build weighted average:
- int y = (r*77)+(g*151)+(b*28);
- // undo the scale by 256 and write to memory:
- *dest++ = (y>>8);
- }
- }
- void neon_convert (uint8_t * __restrict dest, uint8_t * __restrict src, int n)
- {
- int i;
- uint8x8_t rfac = vdup_n_u8 (77);
- uint8x8_t gfac = vdup_n_u8 (151);
- uint8x8_t bfac = vdup_n_u8 (28);
- n/=8;
- for (i=0; i<n; i++)
- {
- uint16x8_t temp;
- uint8x8x3_t rgb = vld3_u8 (src);
- uint8x8_t result;
- temp = vmull_u8 (rgb.val[0], rfac);
- temp = vmlal_u8 (temp,rgb.val[1], gfac);
- temp = vmlal_u8 (temp,rgb.val[2], bfac);
- result = vshrn_n_u16 (temp, 8);
- vst1_u8 (dest, result);
- src += 8*3;
- dest += 8;
- }
- }
- int main ()
- {
- uint8_t src[] = {255, 0, 0,
- 255, 127, 0,
- 255, 255, 0,
- 127, 255, 0,
- 0, 255, 0,
- 0, 255, 127,
- 0, 255, 255,
- 0, 127, 255,
- 0, 0, 255,
- 127, 0, 255,
- 255, 0, 255,
- 255, 0, 127,
- 255, 0, 0,
- 255, 127, 0,
- 255, 255, 0,
- 127, 255, 0,
- 0, 255, 0,
- 0, 255, 127,
- 0, 255, 255,
- 0, 127, 255,
- 0, 0, 255,
- 127, 0, 255,
- 255, 0, 255,
- 255, 0, 127};
- uint8_t dst[24];
- int i;
- // #define REFERENCE
- #ifdef REFERENCE
- for (i = 0; i < 1000000; ++i) {
- reference_convert(dst, src, 24);
- }
- puts("Reference");
- #else
- for (i = 0; i < 1000000; ++i) {
- neon_convert(dst, src, 24);
- }
- puts("Neon");
- #endif
- for (i = 0; i < 24; ++i) {
- printf("dst[%d]=%d\n", i, dst[i]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement