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: PrePostMDCT_v7.s 19 @ 20 @ Content: premdct and postmdct function armv7 assemble 21 @ 22 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 23 24 .section .text 25 .global PreMDCT 26 .fnstart 27 28 PreMDCT: 29 stmdb sp!, {r4 - r11, lr} 30 .save {r4 - r11, lr} 31 fstmfdd sp!, {d8 - d15} 32 .vsave {d8 - d15} 33 34 add r9, r0, r1, lsl #2 35 sub r3, r9, #32 36 37 movs r1, r1, asr #2 38 beq PreMDCT_END 39 40 PreMDCT_LOOP: 41 VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@ 42 VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@ 43 VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(buf0 + 0)@ ti2 = *(buf0 + 1)@ 44 VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@ 45 VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(buf1 - 1)@ ti1 = *(buf1 + 0)@ 46 47 VREV64.32 Q8, Q7 48 VREV64.32 Q9, Q6 49 50 51 VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1) 52 VQDMULH.S32 Q11, Q1, Q8 @ MULHIGH(sina, ti1) 53 VQDMULH.S32 Q12, Q0, Q8 @ MULHIGH(cosa, ti1) 54 VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1) 55 56 VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ 57 VSUB.S32 Q1, Q12, Q13 @ *buf0++ = MULHIGH(cosa, ti1) - MULHIGH(sina, tr1)@ 58 59 VST2.I32 {d0, d1, d2, d3}, [r0]! 60 sub r3, r3, #32 61 62 VQDMULH.S32 Q10, Q2, Q9 @ MULHIGH(cosb, tr2) 63 VQDMULH.S32 Q11, Q3, Q5 @ MULHIGH(sinb, ti2) 64 VQDMULH.S32 Q12, Q2, Q5 @ MULHIGH(cosb, ti2) 65 VQDMULH.S32 Q13, Q3, Q9 @ MULHIGH(sinb, tr2) 66 67 VADD.S32 Q0, Q10, Q11 @ MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@ 68 VSUB.S32 Q1, Q12, Q13 @ MULHIGH(cosa, ti2) - MULHIGH(sina, tr2)@ 69 70 VREV64.32 Q3, Q1 71 VREV64.32 Q2, Q0 72 73 VST2.I32 {d5, d7}, [r3]! 74 VST2.I32 {d4, d6}, [r3]! 75 76 subs r1, r1, #4 77 sub r3, r3, #64 78 bne PreMDCT_LOOP 79 80 PreMDCT_END: 81 fldmfdd sp!, {d8 - d15} 82 ldmia sp!, {r4 - r11, pc} 83 @ENDP @ |PreMDCT| 84 .fnend 85 86 .section .text 87 .global PostMDCT 88 .fnstart 89 90 PostMDCT: 91 stmdb sp!, {r4 - r11, lr} 92 .save {r4 - r11, lr} 93 fstmfdd sp!, {d8 - d15} 94 .vsave {d8 - d15} 95 96 add r9, r0, r1, lsl #2 97 sub r3, r9, #32 98 99 movs r1, r1, asr #2 100 beq PostMDCT_END 101 102 PostMDCT_LOOP: 103 VLD4.I32 {d0, d2, d4, d6}, [r2]! @ cosa = *csptr++@ sina = *csptr++@ 104 VLD4.I32 {d1, d3, d5, d7}, [r2]! @ cosb = *csptr++@ sinb = *csptr++@ 105 VLD2.I32 {d8, d9, d10, d11}, [r0] @ tr1 = *(zbuf1 + 0)@ ti1 = *(zbuf1 + 1)@ 106 VLD2.I32 {d13, d15}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@ 107 VLD2.I32 {d12, d14}, [r3]! @ tr2 = *(zbuf2 - 1)@ ti2 = *(zbuf2 + 0)@ 108 109 VREV64.32 Q8, Q6 110 VREV64.32 Q9, Q7 111 112 VQDMULH.S32 Q10, Q0, Q4 @ MULHIGH(cosa, tr1) 113 VQDMULH.S32 Q11, Q1, Q5 @ MULHIGH(sina, ti1) 114 VQDMULH.S32 Q12, Q0, Q5 @ MULHIGH(cosa, ti1) 115 VQDMULH.S32 Q13, Q1, Q4 @ MULHIGH(sina, tr1) 116 117 VADD.S32 Q0, Q10, Q11 @ *buf0++ = MULHIGH(cosa, tr1) + MULHIGH(sina, ti1)@ 118 VSUB.S32 Q5, Q13, Q12 @ *buf1-- = MULHIGH(sina, tr1) - MULHIGH(cosa, ti1)@ 119 120 VQDMULH.S32 Q10, Q2, Q8 @ MULHIGH(cosb, tr2) 121 VQDMULH.S32 Q11, Q3, Q9 @ MULHIGH(sinb, ti2) 122 VQDMULH.S32 Q12, Q2, Q9 @ MULHIGH(cosb, ti2) 123 VQDMULH.S32 Q13, Q3, Q8 @ MULHIGH(sinb, tr2) 124 125 VADD.S32 Q4, Q10, Q11 @ *buf1-- = MULHIGH(cosa, tr2) + MULHIGH(sina, ti2)@ 126 VSUB.S32 Q1, Q13, Q12 @ *buf0++ = MULHIGH(sina, tr2) - MULHIGH(cosa, ti2)@ 127 128 VREV64.32 Q2, Q4 129 VREV64.32 Q3, Q5 130 131 sub r3, r3, #32 132 VST2.I32 {d0, d1, d2, d3}, [r0]! 133 134 VST2.I32 {d5, d7}, [r3]! 135 VST2.I32 {d4, d6}, [r3]! 136 137 subs r1, r1, #4 138 sub r3, r3, #64 139 bne PostMDCT_LOOP 140 141 PostMDCT_END: 142 fldmfdd sp!, {d8 - d15} 143 ldmia sp!, {r4 - r11, pc} 144 145 @ENDP @ |PostMDCT| 146 .fnend 147