>From 58be83c34eb5b360412049c6fde0b5b85c329da9 Mon Sep 17 00:00:00 2001
From: kui zheng <kui.zh...@arm.com>
Date: Wed, 16 Nov 2011 16:25:04 +0800
Subject: [PATCH] generic: Add NEON version of Sacc_to_Aop_rgb16


Signed-off-by: kui zheng <kui.zh...@arm.com>
---
src/gfx/generic/generic.c      |    2 +
src/gfx/generic/generic_neon.h |  113 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 115 insertions(+), 0 deletions(-)

diff --git a/src/gfx/generic/generic.c b/src/gfx/generic/generic.c
index d6b3b5c..edc1664 100644
--- a/src/gfx/generic/generic.c
+++ b/src/gfx/generic/generic.c
@@ -9660,6 +9660,8 @@ static void gInit_NEON( void )
/********************************* Sop_PFI_to_Dacc ****************************/
      Sop_PFI_to_Dacc[DFB_PIXELFORMAT_INDEX(DSPF_RGB16)] = 
Sop_rgb16_to_Dacc_NEON;
      Sop_PFI_to_Dacc[DFB_PIXELFORMAT_INDEX(DSPF_ARGB )] = 
Sop_argb_to_Dacc_NEON;
+/********************************* Sacc_to_Aop_PFI 
****************************/
+     Sacc_to_Aop_PFI[DFB_PIXELFORMAT_INDEX(DSPF_RGB16)] = 
Sacc_to_Aop_rgb16_NEON;
/********************************* misc accumulator operations ****************/
      SCacc_add_to_Dacc = SCacc_add_to_Dacc_NEON;
      Sacc_add_to_Dacc = Sacc_add_to_Dacc_NEON;
diff --git a/src/gfx/generic/generic_neon.h b/src/gfx/generic/generic_neon.h
index 6498638..907dc44 100644
--- a/src/gfx/generic/generic_neon.h
+++ b/src/gfx/generic/generic_neon.h
@@ -380,3 +380,116 @@ static void Sacc_add_to_Dacc_NEON ( GenefxState *gfxs )
      }
}
+/*
+ * NEON version of Sacc_to_Aop_rgb16
+ */
+static void Sacc_to_Aop_rgb16_NEON ( GenefxState *gfxs )
+{
+     int                w = gfxs->length;
+     GenefxAccumulator  *S = gfxs->Sacc;
+     u16                *D = gfxs->Aop[0];
+     int                Dstep = gfxs->Astep;
+     unsigned int       loop;
+     unsigned int       single;
+     u32                mask = 0xFF00FF00;
+     u32                color = 0x00FF00FF;
+     int                i, j;
+
+#define PIXEL_OUT( a, r, g, b ) PIXEL_RGB16( r, g, b )
+
+#define PIXEL( x ) PIXEL_OUT( ((x).RGB.a & 0xFF00) ? 0xFF : (x).RGB.a, \
+                              ((x).RGB.r & 0xFF00) ? 0xFF : (x).RGB.r, \
+                              ((x).RGB.g & 0xFF00) ? 0xFF : (x).RGB.g, \
+                              ((x).RGB.b & 0xFF00) ? 0xFF : (x).RGB.b )
+
+     if (Dstep != 1) {
+          while (w--) {
+              if (!(S->RGB.a & 0xF000))
+                   *D = PIXEL( *S );
+
+              S++;
+              D += Dstep;
+          }
+          return;
+     }
+
+     if ((long)D & 2) {
+          if (!(S->RGB.a & 0xF000))
+               *D = PIXEL( *S );
+          S++;
+          D++;
+          w--;
+     }
+
+     loop = w >> 3;
+     single = w & 0x7;
+     while(loop){
+          for (i=0; i<8; i++) {
+               if ((S[i].RGB.a & 0xF000)) {
+                    break;
+               }
+          }
+          if (i < 8) {
+               for (j=0; j<i; j++)
+                    D[j] = PIXEL( S[j] );
+               for (j=i+1; j<8; j++) {
+                    if (!(S[j].RGB.a & 0xF000))
+                         D[j] = PIXEL( S[j] );
+               }
+          } else {
+               __asm__ __volatile__ (
+                    "mov        r4, %[S]        \n\t"
+                    "pld        [r4, #0xC0]     \n\t"
+                    "pld        [r4, #0x100]    \n\t"
+                    "vld4.16    {d0, d2, d4, d6}, [r4]! \n\t"
+                    "vld4.16    {d1, d3, d5, d7}, [r4]  \n\t"
+                    "vdup.32    q3, %[mask]     \n\t"
+                    "vdup.32    q4, %[color]    \n\t"
+                    /* b */
+                    "vtst.16    q5, q0, q3      \n\t"
+                    "vceq.u16   q6, q5, #0      \n\t"
+                    "vand.16    q5, q4, q5      \n\t"
+                    "vand.16    q6, q0, q6      \n\t"
+                    "vorr.16    q0, q5, q6      \n\t"
+                    "vshr.u16   q0, q0, #3      \n\t"
+                    /* g */
+                    "vtst.16    q5, q1, q3      \n\t"
+                    "vceq.u16   q6, q5, #0      \n\t"
+                    "vand.16    q5, q4, q5      \n\t"
+                    "vand.16    q6, q1, q6      \n\t"
+                    "vorr.16    q1, q5, q6      \n\t"
+                    "vshr.u16   q1, q1, #2      \n\t"
+                    "vshl.u16   q1, q1, #5      \n\t"
+                    /* r */
+                    "vtst.16    q5, q2, q3      \n\t"
+                    "vceq.u16   q6, q5, #0      \n\t"
+                    "vand.16    q5, q4, q5      \n\t"
+                    "vand.16    q6, q2, q6      \n\t"
+                    "vorr.16    q2, q5, q6      \n\t"
+                    "vshr.u16   q2, q2, #3      \n\t"
+                    "vshl.u16   q2, q2, #11     \n\t"
+                    /* rgb */
+                    "vorr.16    q1, q1, q2      \n\t"
+                    "vorr.16    q0, q0, q1      \n\t"
+                    "vst1.16    {d0, d1}, [%[D]]     "
+                    :
+                    : [D] "r" (D), [S] "r" (S), [mask] "r" (mask), [color] "r" 
(color)
+                    : "memory", "r4", "d0", "d1", "d2", "d3", "d4","d5", "d6",
+                      "d7", "d8", "d9", "d10", "d11", "d12", "d13"
+               );
+               }//else
+                    S += 8;
+                    D += 8;
+                    loop--;
+          }// end of loop
+
+     while (single){
+          if (!(S->RGB.a & 0xF000)) {
+               *D = PIXEL( *S );
+          }
+          S++;
+          D++;
+          single--;
+     }
+}
+
--
1.7.1


-- IMPORTANT NOTICE: The contents of this email and any attachments are 
confidential and may also be privileged. If you are not the intended recipient, 
please notify the sender immediately and do not disclose the contents to any 
other person, use it for any purpose, or store or copy the information in any 
medium. Thank you.

Attachment: 0007-generic-Add-NEON-version-of-Sacc_to_Aop_rgb16.patch
Description: 0007-generic-Add-NEON-version-of-Sacc_to_Aop_rgb16.patch

_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to