Home | History | Annotate | Download | only in opts
      1 /***************************************************************************
      2  * Copyright (c) 2009,2010, Code Aurora Forum. All rights reserved.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  ***************************************************************************/
      7 
      8 	.code 32
      9 	.fpu neon
     10 	.align 4
     11 	.globl	memset32_neon
     12 	.func
     13 
     14 	/* r0 = buffer, r1 = value, r2 = times to write */
     15 memset32_neon:
     16 	cmp		r2, #1
     17 	streq		r1, [r0], #4
     18 	bxeq		lr
     19 
     20 	cmp		r2, #4
     21 	bgt		memset32_neon_start
     22 	cmp		r2, #0
     23 	bxeq		lr
     24 memset32_neon_small:
     25 	str		r1, [r0], #4
     26 	subs		r2, r2, #1
     27 	bne		memset32_neon_small
     28 	bx		lr
     29 memset32_neon_start:
     30 	cmp		r2, #16
     31 	blt		memset32_dropthru
     32 	vdup.32		q0, r1
     33 	vmov		q1, q0
     34 	cmp		r2, #32
     35 	blt		memset32_16
     36 	cmp		r2, #64
     37 	blt		memset32_32
     38 	cmp		r2, #128
     39 	blt		memset32_64
     40 memset32_128:
     41 	movs		r12, r2, lsr #7
     42 memset32_loop128:
     43 	subs		r12, r12, #1
     44 	vst1.64		{q0, q1}, [r0]!
     45 	vst1.64		{q0, q1}, [r0]!
     46 	vst1.64		{q0, q1}, [r0]!
     47 	vst1.64		{q0, q1}, [r0]!
     48 	vst1.64		{q0, q1}, [r0]!
     49 	vst1.64		{q0, q1}, [r0]!
     50 	vst1.64		{q0, q1}, [r0]!
     51 	vst1.64		{q0, q1}, [r0]!
     52 	vst1.64		{q0, q1}, [r0]!
     53 	vst1.64		{q0, q1}, [r0]!
     54 	vst1.64		{q0, q1}, [r0]!
     55 	vst1.64		{q0, q1}, [r0]!
     56 	vst1.64		{q0, q1}, [r0]!
     57 	vst1.64		{q0, q1}, [r0]!
     58 	vst1.64		{q0, q1}, [r0]!
     59 	vst1.64		{q0, q1}, [r0]!
     60 	bne		memset32_loop128
     61 	ands		r2, r2, #0x7f
     62 	bxeq		lr
     63 memset32_64:
     64 	movs		r12, r2, lsr #6
     65 	beq		memset32_32
     66 	vst1.64		{q0, q1}, [r0]!
     67 	vst1.64		{q0, q1}, [r0]!
     68 	vst1.64		{q0, q1}, [r0]!
     69 	vst1.64		{q0, q1}, [r0]!
     70 	vst1.64		{q0, q1}, [r0]!
     71 	vst1.64		{q0, q1}, [r0]!
     72 	vst1.64		{q0, q1}, [r0]!
     73 	vst1.64		{q0, q1}, [r0]!
     74 	ands		r2, r2, #0x3f
     75 	bxeq		lr
     76 memset32_32:
     77 	movs		r12, r2, lsr #5
     78 	beq		memset32_16
     79 	vst1.64		{q0, q1}, [r0]!
     80 	vst1.64		{q0, q1}, [r0]!
     81 	vst1.64		{q0, q1}, [r0]!
     82 	vst1.64		{q0, q1}, [r0]!
     83 	ands		r2, r2, #0x1f
     84 	bxeq		lr
     85 memset32_16:
     86 	movs		r12, r2, lsr #4
     87 	beq		memset32_dropthru
     88 	and		r2, r2, #0xf
     89 	vst1.64		{q0, q1}, [r0]!
     90 	vst1.64		{q0, q1}, [r0]!
     91 memset32_dropthru:
     92 	rsb		r2, r2, #15
     93 	add		pc, pc, r2, lsl #2
     94 	nop
     95 	str		r1, [r0, #56]
     96 	str		r1, [r0, #52]
     97 	str		r1, [r0, #48]
     98 	str		r1, [r0, #44]
     99 	str		r1, [r0, #40]
    100 	str		r1, [r0, #36]
    101 	str		r1, [r0, #32]
    102 	str		r1, [r0, #28]
    103 	str		r1, [r0, #24]
    104 	str		r1, [r0, #20]
    105 	str		r1, [r0, #16]
    106 	str		r1, [r0, #12]
    107 	str		r1, [r0, #8]
    108 	str		r1, [r0, #4]
    109 	str		r1, [r0, #0]
    110 	bx		lr
    111 
    112 	.endfunc
    113 	.end
    114