diff options
Diffstat (limited to 'recipes/xorg-lib/pixman/0006-ARM-Added-a-set-of-NEON-functions-not-fully-optimi.patch')
-rw-r--r-- | recipes/xorg-lib/pixman/0006-ARM-Added-a-set-of-NEON-functions-not-fully-optimi.patch | 540 |
1 files changed, 540 insertions, 0 deletions
diff --git a/recipes/xorg-lib/pixman/0006-ARM-Added-a-set-of-NEON-functions-not-fully-optimi.patch b/recipes/xorg-lib/pixman/0006-ARM-Added-a-set-of-NEON-functions-not-fully-optimi.patch new file mode 100644 index 0000000000..0f89c88fef --- /dev/null +++ b/recipes/xorg-lib/pixman/0006-ARM-Added-a-set-of-NEON-functions-not-fully-optimi.patch @@ -0,0 +1,540 @@ +From 606a73203318e44af4362684368bc24d2aed841d Mon Sep 17 00:00:00 2001 +From: Siarhei Siamashka <siarhei.siamashka@nokia.com> +Date: Mon, 12 Oct 2009 21:57:17 +0300 +Subject: [PATCH 6/7] ARM: Added a set of NEON functions (not fully optimized) + +--- + pixman/pixman-arm-neon-asm.S | 520 ++++++++++++++++++++++++++++++++++++++++++ + 1 files changed, 520 insertions(+), 0 deletions(-) + +diff --git a/pixman/pixman-arm-neon-asm.S b/pixman/pixman-arm-neon-asm.S +index b11a9a7..bca499a 100644 +--- a/pixman/pixman-arm-neon-asm.S ++++ b/pixman/pixman-arm-neon-asm.S +@@ -457,3 +457,523 @@ generate_composite_function \ + pixman_composite_over_8888_8888_process_pixblock_head, \ + pixman_composite_over_8888_8888_process_pixblock_tail, \ + pixman_composite_over_8888_8888_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_over_n_8_0565_process_pixblock_head ++ /* in */ ++ vmull.u8 q0, d24, d8 ++ vmull.u8 q1, d24, d9 ++ vmull.u8 q6, d24, d10 ++ vmull.u8 q7, d24, d11 ++ vrshr.u16 q10, q0, #8 ++ vrshr.u16 q11, q1, #8 ++ vrshr.u16 q12, q6, #8 ++ vrshr.u16 q13, q7, #8 ++ vraddhn.u16 d0, q0, q10 ++ vraddhn.u16 d1, q1, q11 ++ vraddhn.u16 d2, q6, q12 ++ vraddhn.u16 d3, q7, q13 ++ ++ vshrn.u16 d6, q2, #8 ++ vshrn.u16 d7, q2, #3 ++ vsli.u16 q2, q2, #5 ++ vsri.u8 d6, d6, #5 ++ vmvn.8 d3, d3 ++ vsri.u8 d7, d7, #6 ++ vshrn.u16 d30, q2, #2 ++ /* now do alpha blending */ ++ vmull.u8 q10, d3, d6 ++ vmull.u8 q11, d3, d7 ++ vmull.u8 q12, d3, d30 ++ vrshr.u16 q13, q10, #8 ++ vrshr.u16 q3, q11, #8 ++ vrshr.u16 q15, q12, #8 ++ vraddhn.u16 d20, q10, q13 ++ vraddhn.u16 d23, q11, q3 ++ vraddhn.u16 d22, q12, q15 ++.endm ++ ++.macro pixman_composite_over_n_8_0565_process_pixblock_tail ++ vqadd.u8 d16, d2, d20 ++ vqadd.u8 q9, q0, q11 ++ /* convert to r5g6b5 */ ++ vshll.u8 q14, d16, #8 ++ vshll.u8 q8, d19, #8 ++ vshll.u8 q9, d18, #8 ++ vsri.u16 q14, q8, #5 ++ vsri.u16 q14, q9, #11 ++.endm ++ ++/* TODO: expand macros and do better instructions scheduling */ ++.macro pixman_composite_over_n_8_0565_process_pixblock_tail_head ++ pixman_composite_over_n_8_0565_process_pixblock_tail ++ vst1.16 {d28, d29}, [DST_W, :128]! ++ vld1.16 {d4, d5}, [DST_R, :128]! ++ vld1.8 {d24}, [MASK]! ++ cache_preload 8, 8 ++ pixman_composite_over_n_8_0565_process_pixblock_head ++.endm ++ ++.macro pixman_composite_over_n_8_0565_init ++ add DUMMY, sp, #40 ++ vpush {d8-d15} ++ vld1.32 {d11[0]}, [DUMMY] ++ vdup.8 d8, d11[0] ++ vdup.8 d9, d11[1] ++ vdup.8 d10, d11[2] ++ vdup.8 d11, d11[3] ++.endm ++ ++.macro pixman_composite_over_n_8_0565_cleanup ++ vpop {d8-d15} ++.endm ++ ++generate_composite_function \ ++ pixman_composite_over_n_8_0565_asm_neon, 0, 8, 16, \ ++ FLAG_DST_READWRITE, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_over_n_8_0565_init, \ ++ pixman_composite_over_n_8_0565_cleanup, \ ++ pixman_composite_over_n_8_0565_process_pixblock_head, \ ++ pixman_composite_over_n_8_0565_process_pixblock_tail, \ ++ pixman_composite_over_n_8_0565_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_src_0565_0565_process_pixblock_head ++.endm ++ ++.macro pixman_composite_src_0565_0565_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_0565_0565_process_pixblock_tail_head ++ vst1.16 {d0, d1, d2, d3}, [DST_W, :128]! ++ vld1.16 {d0, d1, d2, d3}, [SRC]! ++ cache_preload 16, 16 ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_0565_0565_asm_neon, 16, 0, 16, \ ++ FLAG_DST_WRITEONLY, \ ++ 16, /* number of pixels, processed in a single block */ \ ++ 10, /* prefetch distance */ \ ++ default_init, \ ++ default_cleanup, \ ++ pixman_composite_src_0565_0565_process_pixblock_head, \ ++ pixman_composite_src_0565_0565_process_pixblock_tail, \ ++ pixman_composite_src_0565_0565_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_src_n_8_process_pixblock_head ++.endm ++ ++.macro pixman_composite_src_n_8_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_n_8_process_pixblock_tail_head ++ vst1.8 {d0, d1, d2, d3}, [DST_W, :128]! ++.endm ++ ++.macro pixman_composite_src_n_8_init ++ add DUMMY, sp, #40 ++ vld1.32 {d0[0]}, [DUMMY] ++ vsli.u64 d0, d0, #8 ++ vsli.u64 d0, d0, #16 ++ vsli.u64 d0, d0, #32 ++ vmov d1, d0 ++ vmov q1, q0 ++.endm ++ ++.macro pixman_composite_src_n_8_cleanup ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_n_8_asm_neon, 0, 0, 8, \ ++ FLAG_DST_WRITEONLY, \ ++ 32, /* number of pixels, processed in a single block */ \ ++ 0, /* prefetch distance */ \ ++ pixman_composite_src_n_8_init, \ ++ pixman_composite_src_n_8_cleanup, \ ++ pixman_composite_src_n_8_process_pixblock_head, \ ++ pixman_composite_src_n_8_process_pixblock_tail, \ ++ pixman_composite_src_n_8_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_src_n_0565_process_pixblock_head ++.endm ++ ++.macro pixman_composite_src_n_0565_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_n_0565_process_pixblock_tail_head ++ vst1.16 {d0, d1, d2, d3}, [DST_W, :128]! ++.endm ++ ++.macro pixman_composite_src_n_0565_init ++ add DUMMY, sp, #40 ++ vld1.32 {d0[0]}, [DUMMY] ++ vsli.u64 d0, d0, #16 ++ vsli.u64 d0, d0, #32 ++ vmov d1, d0 ++ vmov q1, q0 ++.endm ++ ++.macro pixman_composite_src_n_0565_cleanup ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_n_0565_asm_neon, 0, 0, 16, \ ++ FLAG_DST_WRITEONLY, \ ++ 16, /* number of pixels, processed in a single block */ \ ++ 0, /* prefetch distance */ \ ++ pixman_composite_src_n_0565_init, \ ++ pixman_composite_src_n_0565_cleanup, \ ++ pixman_composite_src_n_0565_process_pixblock_head, \ ++ pixman_composite_src_n_0565_process_pixblock_tail, \ ++ pixman_composite_src_n_0565_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_src_n_8888_process_pixblock_head ++.endm ++ ++.macro pixman_composite_src_n_8888_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_n_8888_process_pixblock_tail_head ++ vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! ++.endm ++ ++.macro pixman_composite_src_n_8888_init ++ add DUMMY, sp, #40 ++ vld1.32 {d0[0]}, [DUMMY] ++ vsli.u64 d0, d0, #32 ++ vmov d1, d0 ++ vmov q1, q0 ++.endm ++ ++.macro pixman_composite_src_n_8888_cleanup ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_n_8888_asm_neon, 0, 0, 32, \ ++ FLAG_DST_WRITEONLY, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 0, /* prefetch distance */ \ ++ pixman_composite_src_n_8888_init, \ ++ pixman_composite_src_n_8888_cleanup, \ ++ pixman_composite_src_n_8888_process_pixblock_head, \ ++ pixman_composite_src_n_8888_process_pixblock_tail, \ ++ pixman_composite_src_n_8888_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_src_8888_8888_process_pixblock_head ++.endm ++ ++.macro pixman_composite_src_8888_8888_process_pixblock_tail ++.endm ++ ++.macro pixman_composite_src_8888_8888_process_pixblock_tail_head ++ vst1.32 {d0, d1, d2, d3}, [DST_W, :128]! ++ vld1.32 {d0, d1, d2, d3}, [SRC]! ++ cache_preload 8, 8 ++.endm ++ ++generate_composite_function \ ++ pixman_composite_src_8888_8888_asm_neon, 32, 0, 32, \ ++ FLAG_DST_WRITEONLY, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 10, /* prefetch distance */ \ ++ default_init, \ ++ default_cleanup, \ ++ pixman_composite_src_8888_8888_process_pixblock_head, \ ++ pixman_composite_src_8888_8888_process_pixblock_tail, \ ++ pixman_composite_src_8888_8888_process_pixblock_tail_head, \ ++ 0, /* dst_w_basereg */ \ ++ 0, /* dst_r_basereg */ \ ++ 0, /* src_basereg */ \ ++ 0 /* mask_basereg */ ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_over_n_8_8888_process_pixblock_head ++ /* expecting deinterleaved source data in {d8, d9, d10, d11} */ ++ /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ ++ /* and destination data in {d4, d5, d6, d7} */ ++ /* mask is in d24 (d25, d26, d27 are unused) */ ++ ++ /* in */ ++ vmull.u8 q0, d24, d8 ++ vmull.u8 q1, d24, d9 ++ vmull.u8 q6, d24, d10 ++ vmull.u8 q7, d24, d11 ++ vrshr.u16 q10, q0, #8 ++ vrshr.u16 q11, q1, #8 ++ vrshr.u16 q12, q6, #8 ++ vrshr.u16 q13, q7, #8 ++ vraddhn.u16 d0, q0, q10 ++ vraddhn.u16 d1, q1, q11 ++ vraddhn.u16 d2, q6, q12 ++ vraddhn.u16 d3, q7, q13 ++ vmvn.8 d24, d3 /* get inverted alpha */ ++ /* source: d0 - blue, d1 - green, d2 - red, d3 - alpha */ ++ /* destination: d4 - blue, d5 - green, d6 - red, d7 - alpha */ ++ /* now do alpha blending */ ++ vmull.u8 q8, d24, d4 ++ vmull.u8 q9, d24, d5 ++ vmull.u8 q10, d24, d6 ++ vmull.u8 q11, d24, d7 ++.endm ++ ++.macro pixman_composite_over_n_8_8888_process_pixblock_tail ++ vrshr.u16 q14, q8, #8 ++ vrshr.u16 q15, q9, #8 ++ vrshr.u16 q12, q10, #8 ++ vrshr.u16 q13, q11, #8 ++ vraddhn.u16 d28, q14, q8 ++ vraddhn.u16 d29, q15, q9 ++ vraddhn.u16 d30, q12, q10 ++ vraddhn.u16 d31, q13, q11 ++ vqadd.u8 q14, q0, q14 ++ vqadd.u8 q15, q1, q15 ++.endm ++ ++/* TODO: expand macros and do better instructions scheduling */ ++.macro pixman_composite_over_n_8_8888_process_pixblock_tail_head ++ pixman_composite_over_n_8_8888_process_pixblock_tail ++ vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! ++ vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! ++ vld1.8 {d24}, [MASK]! ++ cache_preload 8, 8 ++ pixman_composite_over_n_8_8888_process_pixblock_head ++.endm ++ ++.macro pixman_composite_over_n_8_8888_init ++ add DUMMY, sp, #40 ++ vpush {d8-d15} ++ vld1.32 {d11[0]}, [DUMMY] ++ vdup.8 d8, d11[0] ++ vdup.8 d9, d11[1] ++ vdup.8 d10, d11[2] ++ vdup.8 d11, d11[3] ++.endm ++ ++.macro pixman_composite_over_n_8_8888_cleanup ++ vpop {d8-d15} ++.endm ++ ++generate_composite_function \ ++ pixman_composite_over_n_8_8888_asm_neon, 0, 8, 32, \ ++ FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_over_n_8_8888_init, \ ++ pixman_composite_over_n_8_8888_cleanup, \ ++ pixman_composite_over_n_8_8888_process_pixblock_head, \ ++ pixman_composite_over_n_8_8888_process_pixblock_tail, \ ++ pixman_composite_over_n_8_8888_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_add_n_8_8_process_pixblock_head ++ /* expecting source data in {d8, d9, d10, d11} */ ++ /* d8 - blue, d9 - green, d10 - red, d11 - alpha */ ++ /* and destination data in {d4, d5, d6, d7} */ ++ /* mask is in d24, d25, d26, d27 */ ++ vmull.u8 q0, d24, d11 ++ vmull.u8 q1, d25, d11 ++ vmull.u8 q6, d26, d11 ++ vmull.u8 q7, d27, d11 ++ vrshr.u16 q10, q0, #8 ++ vrshr.u16 q11, q1, #8 ++ vrshr.u16 q12, q6, #8 ++ vrshr.u16 q13, q7, #8 ++ vraddhn.u16 d0, q0, q10 ++ vraddhn.u16 d1, q1, q11 ++ vraddhn.u16 d2, q6, q12 ++ vraddhn.u16 d3, q7, q13 ++ vqadd.u8 q14, q0, q2 ++ vqadd.u8 q15, q1, q3 ++.endm ++ ++.macro pixman_composite_add_n_8_8_process_pixblock_tail ++.endm ++ ++/* TODO: expand macros and do better instructions scheduling */ ++.macro pixman_composite_add_n_8_8_process_pixblock_tail_head ++ pixman_composite_add_n_8_8_process_pixblock_tail ++ vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! ++ vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! ++ vld1.8 {d24, d25, d26, d27}, [MASK]! ++ cache_preload 32, 32 ++ pixman_composite_add_n_8_8_process_pixblock_head ++.endm ++ ++.macro pixman_composite_add_n_8_8_init ++ add DUMMY, sp, #40 ++ vpush {d8-d15} ++ vld1.32 {d11[0]}, [DUMMY] ++ vdup.8 d11, d11[3] ++.endm ++ ++.macro pixman_composite_add_n_8_8_cleanup ++ vpop {d8-d15} ++.endm ++ ++generate_composite_function \ ++ pixman_composite_add_n_8_8_asm_neon, 0, 8, 8, \ ++ FLAG_DST_READWRITE, \ ++ 32, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_add_n_8_8_init, \ ++ pixman_composite_add_n_8_8_cleanup, \ ++ pixman_composite_add_n_8_8_process_pixblock_head, \ ++ pixman_composite_add_n_8_8_process_pixblock_tail, \ ++ pixman_composite_add_n_8_8_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_add_8_8_8_process_pixblock_head ++ /* expecting source data in {d0, d1, d2, d3} */ ++ /* destination data in {d4, d5, d6, d7} */ ++ /* mask in {d24, d25, d26, d27} */ ++ vmull.u8 q8, d24, d0 ++ vmull.u8 q9, d25, d1 ++ vmull.u8 q10, d26, d2 ++ vmull.u8 q11, d27, d3 ++ vrshr.u16 q0, q8, #8 ++ vrshr.u16 q1, q9, #8 ++ vrshr.u16 q12, q10, #8 ++ vrshr.u16 q13, q11, #8 ++ vraddhn.u16 d0, q0, q8 ++ vraddhn.u16 d1, q1, q9 ++ vraddhn.u16 d2, q12, q10 ++ vraddhn.u16 d3, q13, q11 ++ vqadd.u8 q14, q0, q2 ++ vqadd.u8 q15, q1, q3 ++.endm ++ ++.macro pixman_composite_add_8_8_8_process_pixblock_tail ++.endm ++ ++/* TODO: expand macros and do better instructions scheduling */ ++.macro pixman_composite_add_8_8_8_process_pixblock_tail_head ++ pixman_composite_add_8_8_8_process_pixblock_tail ++ vst1.8 {d28, d29, d30, d31}, [DST_W, :128]! ++ vld1.8 {d4, d5, d6, d7}, [DST_R, :128]! ++ vld1.8 {d24, d25, d26, d27}, [MASK]! ++ vld1.8 {d0, d1, d2, d3}, [SRC]! ++ cache_preload 32, 32 ++ pixman_composite_add_8_8_8_process_pixblock_head ++.endm ++ ++.macro pixman_composite_add_8_8_8_init ++.endm ++ ++.macro pixman_composite_add_8_8_8_cleanup ++.endm ++ ++generate_composite_function \ ++ pixman_composite_add_8_8_8_asm_neon, 8, 8, 8, \ ++ FLAG_DST_READWRITE, \ ++ 32, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_add_8_8_8_init, \ ++ pixman_composite_add_8_8_8_cleanup, \ ++ pixman_composite_add_8_8_8_process_pixblock_head, \ ++ pixman_composite_add_8_8_8_process_pixblock_tail, \ ++ pixman_composite_add_8_8_8_process_pixblock_tail_head ++ ++/******************************************************************************/ ++ ++.macro pixman_composite_over_8888_n_8888_process_pixblock_head ++ /* expecting source data in {d0, d1, d2, d3} */ ++ /* destination data in {d4, d5, d6, d7} */ ++ /* solid mask is in d15 */ ++ ++ /* 'in' */ ++ vmull.u8 q8, d15, d3 ++ vmull.u8 q6, d15, d2 ++ vmull.u8 q5, d15, d1 ++ vmull.u8 q4, d15, d0 ++ vrshr.u16 q13, q8, #8 ++ vrshr.u16 q12, q6, #8 ++ vrshr.u16 q11, q5, #8 ++ vrshr.u16 q10, q4, #8 ++ vraddhn.u16 d3, q8, q13 ++ vraddhn.u16 d2, q6, q12 ++ vraddhn.u16 d1, q5, q11 ++ vraddhn.u16 d0, q4, q10 ++ vmvn.8 d24, d3 /* get inverted alpha */ ++ /* now do alpha blending */ ++ vmull.u8 q8, d24, d4 ++ vmull.u8 q9, d24, d5 ++ vmull.u8 q10, d24, d6 ++ vmull.u8 q11, d24, d7 ++.endm ++ ++.macro pixman_composite_over_8888_n_8888_process_pixblock_tail ++ vrshr.u16 q14, q8, #8 ++ vrshr.u16 q15, q9, #8 ++ vrshr.u16 q12, q10, #8 ++ vrshr.u16 q13, q11, #8 ++ vraddhn.u16 d28, q14, q8 ++ vraddhn.u16 d29, q15, q9 ++ vraddhn.u16 d30, q12, q10 ++ vraddhn.u16 d31, q13, q11 ++ vqadd.u8 q14, q0, q14 ++ vqadd.u8 q15, q1, q15 ++.endm ++ ++/* TODO: expand macros and do better instructions scheduling */ ++.macro pixman_composite_over_8888_n_8888_process_pixblock_tail_head ++ vld4.8 {d4, d5, d6, d7}, [DST_R, :128]! ++ pixman_composite_over_8888_n_8888_process_pixblock_tail ++ vld4.8 {d0, d1, d2, d3}, [SRC]! ++ cache_preload 8, 8 ++ pixman_composite_over_8888_n_8888_process_pixblock_head ++ vst4.8 {d28, d29, d30, d31}, [DST_W, :128]! ++.endm ++ ++.macro pixman_composite_over_8888_n_8888_init ++ add DUMMY, sp, #48 ++ vpush {d8-d15} ++ vld1.32 {d15[0]}, [DUMMY] ++ vdup.8 d15, d15[3] ++.endm ++ ++.macro pixman_composite_over_8888_n_8888_cleanup ++ vpop {d8-d15} ++.endm ++ ++generate_composite_function \ ++ pixman_composite_over_8888_n_8888_asm_neon, 32, 0, 32, \ ++ FLAG_DST_READWRITE | FLAG_DEINTERLEAVE_32BPP, \ ++ 8, /* number of pixels, processed in a single block */ \ ++ 5, /* prefetch distance */ \ ++ pixman_composite_over_8888_n_8888_init, \ ++ pixman_composite_over_8888_n_8888_cleanup, \ ++ pixman_composite_over_8888_n_8888_process_pixblock_head, \ ++ pixman_composite_over_8888_n_8888_process_pixblock_tail, \ ++ pixman_composite_over_8888_n_8888_process_pixblock_tail_head +-- +1.6.2.4 + |