Home | History | Annotate | Download | only in ARMV5E
      1 @/*
      2 @ ** Copyright 2003-2010, VisualOn, Inc.
      3 @ **
      4 @ ** Licensed under the Apache License, Version 2.0 (the "License");
      5 @ ** you may not use this file except in compliance with the License.
      6 @ ** You may obtain a copy of the License at
      7 @ **
      8 @ **     http://www.apache.org/licenses/LICENSE-2.0
      9 @ **
     10 @ ** Unless required by applicable law or agreed to in writing, software
     11 @ ** distributed under the License is distributed on an "AS IS" BASIS,
     12 @ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13 @ ** See the License for the specific language governing permissions and
     14 @ ** limitations under the License.
     15 @ */
     16 
     17 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     18 @	File:		R4R8First_v5.s
     19 @
     20 @	Content:	Radix8First and Radix4First function armv5 assemble
     21 @
     22 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
     23 
     24 	.section .text
     25 	.global	Radix4First
     26 
     27 Radix4First:
     28 	stmdb       sp!, {r4 - r11, lr}
     29 
     30 	movs				r10, r1
     31 	mov					r11, r0
     32 	beq					Radix4First_END
     33 
     34 Radix4First_LOOP:
     35 	ldrd				r0, [r11]
     36 	ldrd				r2, [r11, #8]
     37 	ldrd				r4, [r11, #16]
     38 	ldrd				r6, [r11, #24]
     39 
     40 	add					r8, r0, r2
     41 	add					r9, r1, r3
     42 
     43 	sub					r0, r0, r2
     44 	sub					r1, r1, r3
     45 
     46 	add					r2, r4, r6
     47 	add					r3, r5, r7
     48 
     49 	sub					r4, r4, r6
     50 	sub					r5, r5, r7
     51 
     52 	add					r6, r8, r2
     53 	add					r7, r9, r3
     54 
     55 	sub					r8, r8, r2
     56 	sub					r9, r9, r3
     57 
     58 	add					r2, r0, r5
     59 	sub					r3, r1, r4
     60 
     61 	sub					r0, r0, r5
     62 	add					r1, r1, r4
     63 
     64 	strd				r6, [r11]
     65 	strd				r2, [r11, #8]
     66 	strd				r8, [r11, #16]
     67 	strd				r0, [r11, #24]
     68 
     69 	subs				r10, r10, #1
     70 	add					r11, r11, #32
     71 	bne					Radix4First_LOOP
     72 
     73 Radix4First_END:
     74 	ldmia       sp!, {r4 - r11, pc}
     75 	@ENDP  @ |Radix4First|
     76 
     77 	.section .text
     78 	.global	Radix8First
     79 
     80 Radix8First:
     81 	stmdb       sp!, {r4 - r11, lr}
     82 	sub         sp, sp, #0x24
     83 
     84 	mov				  r12, r1
     85 	mov					r14, r0
     86 	cmp					r12, #0
     87 	beq					Radix8First_END
     88 
     89 Radix8First_LOOP:
     90 	ldrd				r0, [r14]
     91 	ldrd				r2, [r14, #8]
     92 	ldrd				r4, [r14, #16]
     93 	ldrd				r6, [r14, #24]
     94 
     95 	add					r8, r0, r2					@ r0 = buf[0] + buf[2]@
     96 	add					r9, r1, r3					@ i0 = buf[1] + buf[3]@
     97 
     98 	sub					r0, r0, r2					@ r1 = buf[0] - buf[2]@
     99 	sub					r1, r1, r3					@ i1 = buf[1] - buf[3]@
    100 
    101 	add					r2, r4, r6					@	r2 = buf[4] + buf[6]@
    102 	add					r3, r5, r7					@ i2 = buf[5] + buf[7]@
    103 
    104 	sub					r4, r4, r6					@	r3 = buf[4] - buf[6]@
    105 	sub					r5, r5, r7					@ i3 = buf[5] - buf[7]@
    106 
    107 	add					r6, r8, r2					@ r4 = (r0 + r2) >> 1@
    108 	add					r7, r9, r3					@ i4 = (i0 + i2) >> 1@
    109 
    110 	sub					r8, r8, r2					@	r5 = (r0 - r2) >> 1@
    111 	sub					r9, r9, r3					@ i5 = (i0 - i2) >> 1@
    112 
    113 	sub					r2, r0, r5					@ r6 = (r1 - i3) >> 1@
    114 	add					r3, r1, r4					@ i6 = (i1 + r3) >> 1@
    115 
    116 	add					r0, r0, r5					@ r7 = (r1 + i3) >> 1@
    117 	sub					r1, r1, r4					@ i7 = (i1 - r3) >> 1@
    118 
    119 	mov					r6, r6, asr #1			@
    120 	mov					r7, r7, asr #1			@
    121 
    122 	mov					r8, r8, asr #1
    123 	mov					r9, r9, asr #1
    124 
    125 	mov					r2, r2, asr #1
    126 	mov					r3, r3, asr #1
    127 
    128 	mov					r0, r0, asr #1
    129 	mov					r1, r1, asr #1
    130 
    131 	str					r6, [sp]
    132 	str					r7, [sp, #4]
    133 
    134 	str					r8, [sp, #8]
    135 	str					r9, [sp, #12]
    136 
    137 	str					r2, [sp, #16]
    138 	str					r3, [sp, #20]
    139 
    140 	str					r0, [sp, #24]
    141 	str					r1, [sp, #28]
    142 
    143 	ldrd				r2, [r14, #32]
    144 	ldrd				r4, [r14, #40]
    145 	ldrd				r6, [r14, #48]
    146 	ldrd				r8, [r14, #56]
    147 
    148 	add					r0, r2, r4					@ r0 = buf[ 8] + buf[10]@
    149 	add					r1, r3, r5					@ i0 = buf[ 9] + buf[11]@
    150 
    151 	sub					r2, r2, r4					@ r1 = buf[ 8] - buf[10]@
    152 	sub					r3, r3, r5					@ i1 = buf[ 9] - buf[11]@
    153 
    154 	add					r4, r6, r8					@ r2 = buf[12] + buf[14]@
    155 	add					r5, r7, r9					@ i2 = buf[13] + buf[15]@
    156 
    157 	sub					r6, r6, r8					@ r3 = buf[12] - buf[14]@
    158 	sub					r7, r7, r9					@	i3 = buf[13] - buf[15]@
    159 
    160 	add					r8, r0, r4					@ t0 = (r0 + r2)
    161 	add					r9, r1, r5					@ t1 = (i0 + i2)
    162 
    163 	sub					r0, r0, r4					@ t2 = (r0 - r2)
    164 	sub					r1, r1, r5					@ t3 = (i0 - i2)
    165 
    166 	mov					r8, r8, asr #1
    167 	ldr					r4, [sp]
    168 
    169 	mov					r9, r9, asr #1
    170 	ldr					r5, [sp, #4]
    171 
    172 	mov					r0, r0, asr #1
    173 	mov					r1, r1, asr #1
    174 
    175 	add					r10, r4, r8					@ buf[ 0] = r4 + t0@
    176 	add					r11, r5, r9					@ buf[ 1] = i4 + t1@
    177 
    178 	sub					r4,  r4, r8					@ buf[ 8] = r4 - t0@
    179 	sub					r5,  r5, r9					@	buf[ 9] = i4 - t1@
    180 
    181  	strd				r10, [r14]
    182  	strd				r4,  [r14, #32]
    183 
    184  	ldr					r10, [sp, #8]
    185  	ldr					r11, [sp, #12]
    186 
    187  	add					r4, r10, r1					@ buf[ 4] = r5 + t3@
    188  	sub					r5, r11, r0					@	buf[ 5] = i5 - t2@
    189 
    190  	sub					r10, r10, r1				@ buf[12] = r5 - t3@
    191  	add					r11, r11, r0				@ buf[13] = i5 + t2@
    192 
    193  	strd				r4,  [r14, #16]
    194  	strd				r10, [r14, #48]
    195 
    196  	sub					r0, r2, r7					@ r0 = r1 - i3@
    197  	add					r1, r3, r6					@ i0 = i1 + r3@
    198 
    199   ldr					r11, DATATab
    200 
    201  	add					r2, r2, r7					@ r2 = r1 + i3@
    202  	sub					r3, r3, r6					@ i2 = i1 - r3@
    203 
    204 	sub					r4, r0, r1					@ r0 - i0
    205 	add					r5, r0, r1					@ r0 + i0
    206 
    207 	sub					r0, r2, r3					@ r2 - i2
    208 	add					r1, r2, r3					@ r2 + i2
    209 
    210 	smull				r8, r6, r4, r11
    211 	smull				r9, r7, r5, r11
    212 
    213 	ldr					r2, [sp, #16]
    214 	ldr					r3, [sp, #20]
    215 
    216 	smull				r8, r4, r0, r11
    217 	smull				r9, r5, r1, r11
    218 
    219 	ldr					r10, [sp, #24]
    220 	ldr					r11, [sp, #28]
    221 
    222 	sub					r8, r2, r6
    223 	sub					r9, r3, r7
    224 
    225 	add					r2, r2, r6
    226 	add					r3, r3, r7
    227 
    228 	add					r6, r10, r5
    229 	sub					r7, r11, r4
    230 
    231 	sub					r0, r10, r5
    232 	add					r1, r11, r4
    233 
    234 	strd				r6, [r14, #8]
    235 	strd				r8, [r14, #24]
    236 	strd				r0, [r14, #40]
    237 	strd				r2, [r14, #56]
    238 
    239 	subs				r12, r12, #1
    240 	add					r14, r14, #64
    241 
    242 	bne					Radix8First_LOOP
    243 
    244 Radix8First_END:
    245 	add         sp, sp, #0x24
    246 	ldmia       sp!, {r4 - r11, pc}
    247 
    248 DATATab:
    249 	.word       0x5a82799a
    250 
    251 	@ENDP  @ |Radix8First|
    252 	.end
    253