summaryrefslogtreecommitdiff
path: root/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
diff options
context:
space:
mode:
authorJason Sams <jsams@google.com>2013-08-09 13:42:28 -0700
committerJason Sams <jsams@google.com>2013-08-09 13:42:28 -0700
commita65de10aabdee0794d0e9c96db944e990166ef0d (patch)
treec4239cac98e198a6a55e7c31294a724389c100d2 /cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
parent4de7d5bf832ba06b6c9db4ec1dc5fdabd782e2ac (diff)
downloadrs-a65de10aabdee0794d0e9c96db944e990166ef0d.tar.gz
Float color matrix support.
Change-Id: I106b0cb1ad511aa549e4c90d79b3e84b55da45e4
Diffstat (limited to 'cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S')
-rw-r--r--cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S163
1 files changed, 155 insertions, 8 deletions
diff --git a/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S b/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
index ce8c033d..39e559fb 100644
--- a/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
+++ b/cpu_ref/rsCpuIntrinsics_neon_ColorMatrix.S
@@ -18,20 +18,41 @@
#include <machine/asm.h>
#define SNIP_START(x) \
- .globl x; x:
+ .globl x; x:
#define SNIP_END(x) \
- .globl x##_end; x##_end: \
- .globl x##_len; x##_len: \
+ .globl x##_end; x##_end: \
+ .globl x##_len; x##_len: \
.word x##_end-x
-SNIP_START(_N_ColorMatrix_prefix)
+SNIP_START(_N_ColorMatrix_prefix_i)
stmfd sp!, {r4, lr}
vpush {q4-q7}
vld1.16 {q2}, [r2]!
vld1.16 {q3}, [r2]!
- vld1.16 {d8}, [r2]!
-SNIP_END(_N_ColorMatrix_prefix)
+ vld1.32 {q4}, [r2]!
+ vld1.32 {q5}, [r2]!
+ vld1.32 {q6}, [r2]!
+ vld1.32 {q7}, [r2]!
+ veor q0, q0
+ veor q1, q1
+SNIP_END(_N_ColorMatrix_prefix_i)
+
+SNIP_START(_N_ColorMatrix_prefix_f)
+ stmfd sp!, {r4, lr}
+ vpush {q4-q7}
+ vld1.32 {q4}, [r2]!
+ vld1.32 {q5}, [r2]!
+ vld1.32 {q6}, [r2]!
+ vld1.32 {q7}, [r2]!
+ vld1.32 {q8}, [r2]!
+ vld1.32 {q9}, [r2]!
+ vld1.32 {q10}, [r2]!
+ vld1.32 {q11}, [r2]!
+ veor q1, q1
+ veor q2, q2
+ veor q3, q3
+SNIP_END(_N_ColorMatrix_prefix_f)
SNIP_START(_N_ColorMatrix_postfix1)
subs r3, r3, #1
@@ -43,6 +64,10 @@ SNIP_START(_N_ColorMatrix_postfix2)
#mov r0, #0
#ldr r0, [r0]
+ #vqadd.s32 q0,q0,q0
+ #vadd.f32 q0,q0,q0
+
+
vpop {q4-q7}
ldmfd sp!, {r4, lr}
bx lr
@@ -63,10 +88,69 @@ SNIP_START(_N_ColorMatrix_load_u8_2)
SNIP_END(_N_ColorMatrix_load_u8_2)
SNIP_START(_N_ColorMatrix_load_u8_1)
- vld1.32 {d0}, [r1]!
+ vld1.32 {d0[0]}, [r1]!
SNIP_END(_N_ColorMatrix_load_u8_1)
+SNIP_START(_N_ColorMatrix_load_u8f_4)
+ vld4.8 {d0[0],d1[0],d2[0],d3[0]}, [r1]!
+ vld4.8 {d0[1],d1[1],d2[1],d3[1]}, [r1]!
+ vld4.8 {d0[2],d1[2],d2[2],d3[2]}, [r1]!
+ vld4.8 {d0[3],d1[3],d2[3],d3[3]}, [r1]!
+ vmovl.u8 q3, d3
+ vmovl.u8 q2, d2
+ vmovl.u8 q1, d1
+ vmovl.u8 q0, d0
+ vmovl.u16 q3, d3
+ vmovl.u16 q2, d2
+ vmovl.u16 q1, d1
+ vmovl.u16 q0, d0
+ vcvt.f32.s32 q3, q3
+ vcvt.f32.s32 q2, q2
+ vcvt.f32.s32 q1, q1
+ vcvt.f32.s32 q0, q0
+SNIP_END(_N_ColorMatrix_load_u8f_4)
+
+SNIP_START(_N_ColorMatrix_load_u8f_2)
+ vld2.8 {d0[0],d1[0]}, [r1]!
+ vld2.8 {d0[1],d1[1]}, [r1]!
+ vld2.8 {d0[2],d1[2]}, [r1]!
+ vld2.8 {d0[3],d1[3]}, [r1]!
+ vmovl.u8 q1, d1
+ vmovl.u8 q0, d0
+ vmovl.u16 q1, d1
+ vmovl.u16 q0, d0
+ vcvt.f32.s32 q1, q1
+ vcvt.f32.s32 q0, q0
+SNIP_END(_N_ColorMatrix_load_u8f_2)
+
+SNIP_START(_N_ColorMatrix_load_u8f_1)
+ vld1.32 {d0}, [r1]!
+ vmovl.u8 q0, d0
+ vmovl.u16 q0, d0
+ vcvt.f32.s32 q0, q0
+SNIP_END(_N_ColorMatrix_load_u8f_1)
+
+SNIP_START(_N_ColorMatrix_load_f32_4)
+ vld4.32 {d0[0],d2[0],d4[0],d6[0]}, [r1]!
+ vld4.32 {d0[1],d2[1],d4[1],d6[1]}, [r1]!
+ vld4.32 {d1[0],d3[0],d5[0],d7[0]}, [r1]!
+ vld4.32 {d1[1],d3[1],d5[1],d7[1]}, [r1]!
+SNIP_END(_N_ColorMatrix_load_f32_4)
+
+SNIP_START(_N_ColorMatrix_load_f32_2)
+ vld2.32 {d0[0],d2[0]}, [r1]!
+ vld2.32 {d0[1],d2[1]}, [r1]!
+ vld2.32 {d1[0],d3[0]}, [r1]!
+ vld2.32 {d1[1],d3[1]}, [r1]!
+SNIP_END(_N_ColorMatrix_load_f32_2)
+
+SNIP_START(_N_ColorMatrix_load_f32_1)
+ vld1.32 {q0}, [r1]!
+SNIP_END(_N_ColorMatrix_load_f32_1)
+
+
SNIP_START(_N_ColorMatrix_store_u8_4)
+#mov r0, #0
vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
@@ -81,9 +165,72 @@ SNIP_START(_N_ColorMatrix_store_u8_2)
SNIP_END(_N_ColorMatrix_store_u8_2)
SNIP_START(_N_ColorMatrix_store_u8_1)
- vst1.32 {d0}, [r0]!
+ vst1.32 {d0[0]}, [r0]!
SNIP_END(_N_ColorMatrix_store_u8_1)
+
+SNIP_START(_N_ColorMatrix_store_f32u_4)
+ vcvt.s32.f32 q0, q0
+ vcvt.s32.f32 q1, q1
+ vcvt.s32.f32 q2, q2
+ vcvt.s32.f32 q3, q3
+ vqmovn.s32 d0, q0
+ vqmovn.s32 d1, q1
+ vqmovn.s32 d2, q2
+ vqmovn.s32 d3, q3
+ vqmovn.s16 d0, q0
+ vqmovun.s16 d0, q0
+ vqmovun.s16 d1, q1
+ vqmovun.s16 d2, q2
+ vqmovun.s16 d3, q3
+ vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
+ vst4.8 {d0[1],d1[1],d2[1],d3[1]}, [r0]!
+ vst4.8 {d0[2],d1[2],d2[2],d3[2]}, [r0]!
+ vst4.8 {d0[3],d1[3],d2[3],d3[3]}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32u_4)
+
+SNIP_START(_N_ColorMatrix_store_f32u_2)
+ vcvt.s32.f32 q0, q0
+ vcvt.s32.f32 q1, q1
+ vqmovn.s32 d0, q0
+ vqmovn.s32 d1, q1
+ vqmovn.s16 d0, q0
+ vqmovun.s16 d0, q0
+ vqmovun.s16 d1, q1
+ vst4.8 {d0[0],d1[0],d2[0],d3[0]}, [r0]!
+ vst2.8 {d0[0],d1[0]}, [r0]!
+ vst2.8 {d0[1],d1[1]}, [r0]!
+ vst2.8 {d0[2],d1[2]}, [r0]!
+ vst2.8 {d0[3],d1[3]}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32u_2)
+
+SNIP_START(_N_ColorMatrix_store_f32u_1)
+ vcvt.s32.f32 q0, q0
+ vqmovn.s32 d0, q0
+ vqmovn.s16 d0, q0
+ vqmovun.s16 d0, q0
+ vst1.32 {d0[0]}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32u_1)
+
+SNIP_START(_N_ColorMatrix_store_f32_4)
+ vst4.32 {d0[0],d2[0],d4[0],d6[0]}, [r0]!
+ vst4.32 {d0[1],d2[1],d4[1],d6[1]}, [r0]!
+ vst4.32 {d1[0],d3[0],d5[0],d7[0]}, [r0]!
+ vst4.32 {d1[1],d3[1],d5[1],d7[1]}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32_4)
+
+SNIP_START(_N_ColorMatrix_store_f32_2)
+ vst2.32 {d0[0],d2[0]}, [r0]!
+ vst2.32 {d0[1],d2[1]}, [r0]!
+ vst2.32 {d1[0],d3[0]}, [r0]!
+ vst2.32 {d1[1],d3[1]}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32_2)
+
+SNIP_START(_N_ColorMatrix_store_f32_1)
+ vst1.32 {q0}, [r0]!
+SNIP_END(_N_ColorMatrix_store_f32_1)
+
+
SNIP_START(_N_ColorMatrix_unpack_u8_4)
vmovl.u8 q12, d0 /* R */
vmovl.u8 q13, d1 /* G */