| /*************************************************************************** |
| * __________ __ ___. |
| * Open \______ \ ____ ____ | | _\_ |__ _______ ___ |
| * Source | _// _ \_/ ___\| |/ /| __ \ / _ \ \/ / |
| * Jukebox | | ( <_> ) \___| < | \_\ ( <_> > < < |
| * Firmware |____|_ /\____/ \___ >__|_ \|___ /\____/__/\_ \ |
| * \/ \/ \/ \/ \/ |
| * $Id$ |
| * |
| * Copyright (C) 2007 by Tomasz Malesinski |
| * |
| * This program is free software; you can redistribute it and/or |
| * modify it under the terms of the GNU General Public License |
| * as published by the Free Software Foundation; either version 2 |
| * of the License, or (at your option) any later version. |
| * |
| * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY |
| * KIND, either express or implied. |
| * |
| ****************************************************************************/ |
| |
| #include "mad_iram.h" |
| |
| .global dct32 |
| |
| .section ICODE_SECTION_MPA_ARM,"ax",%progbits |
| |
| dct32: |
| stmdb r13!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, lr} |
| sub r13, r13, #144 |
| str r0, [r13, #12] |
| str r1, [r13, #8] |
| str r2, [r13, #4] |
| str r3, [r13] |
| add r0, r13, #16 |
| add r1, r0, #128 |
| ldr r2, =bitrev |
| .shuffle: |
| ldr r5, [r13, #12] |
| ldr r3, [r2], #4 |
| sub r4, r5, r3, lsl #4 |
| add r3, r5, r3, lsl #4 |
| ldr r6, [r3] |
| ldr r8, [r4, #124] |
| add r6, r6, r8 |
| sub r8, r6, r8, lsl #1 |
| ldr r7, [r3, #8] |
| ldr lr, [r4, #116] |
| add r7, r7, lr |
| sub lr, r7, lr, lsl #1 |
| ldr r10, [r3, #64] |
| ldr r9, [r4, #60] |
| add r10, r10, r9 |
| sub r9, r10, r9, lsl #1 |
| ldr r11, [r3, #72] |
| ldr r12, [r4, #52] |
| add r11, r11, r12 |
| sub r12, r11, r12, lsl #1 |
| add r6, r6, r10 |
| sub r10, r6, r10, lsl #1 |
| add r7, r7, r11 |
| sub r11, r7, r11, lsl #1 |
| add r8, r8, r12 |
| sub r12, r8, r12, lsl #1 |
| add lr, lr, r9 |
| sub r9, lr, r9, lsl #1 |
| stmia r0!, {r6, r7, r8, r9, r10, r11, r12, lr} |
| cmp r0, r1 |
| bne .shuffle |
| ldr r0, =189812531 |
| add r1, r13, #16 |
| add r3, r1, #128 |
| .l2: |
| add r2, r1, #32 |
| ldmia r2, {r4, r5, r8, r9} |
| ldmia r1, {r6, r7, r10, r11} |
| add r6, r6, r4 |
| sub r4, r6, r4, lsl #1 |
| add r7, r7, r5 |
| sub r5, r7, r5, lsl #1 |
| stmia r2!, {r4, r5} |
| stmia r1!, {r6, r7} |
| add r9, r9, r8 |
| sub r8, r9, r8, lsl #1 |
| smull r4, r6, r9, r0 |
| movs r4, r4, lsr #28 |
| adc r4, r4, r6, lsl #4 |
| smull r5, r6, r8, r0 |
| movs r5, r5, lsr #28 |
| adc r5, r5, r6, lsl #4 |
| add r10, r10, r4 |
| sub r4, r10, r4, lsl #1 |
| add r11, r11, r5 |
| sub r5, r11, r5, lsl #1 |
| stmia r2!, {r4, r5} |
| stmia r1!, {r10, r11} |
| ldmia r2, {r5, r6, r8, r11} |
| ldmia r1, {r4, r7, r9, r10} |
| add r4, r4, r6 |
| sub r6, r4, r6, lsl #1 |
| add r7, r7, r5 |
| sub r5, r7, r5, lsl #1 |
| stmia r2!, {r6, r7} |
| stmia r1!, {r4, r5} |
| add r11, r11, r8 |
| sub r8, r11, r8, lsl #1 |
| smull r5, r4, r8, r0 |
| movs r5, r5, lsr #28 |
| adc r5, r5, r4, lsl #4 |
| smull r6, r4, r11, r0 |
| movs r6, r6, lsr #28 |
| adc r6, r6, r4, lsl #4 |
| add r9, r9, r5 |
| sub r5, r9, r5, lsl #1 |
| sub r10, r10, r6 |
| add r6, r10, r6, lsl #1 |
| stmia r2!, {r5, r6} |
| stmia r1!, {r9, r10} |
| add r1, r1, #32 |
| cmp r1, r3 |
| bne .l2 |
| add r2, r13, #16 |
| add r3, r2, #64 |
| ldr r0, =sincos |
| add r1, r0, #128 |
| .lbut8: |
| ldmia r3, {r7, r8} |
| ldmia r0, {r9, r10} |
| add r0, r0, #16 |
| smull r6, r5, r7, r9 |
| smlal r6, r5, r10, r8 |
| movs r6, r6, lsr #28 |
| adc r6, r6, r5, lsl #4 |
| smull r10, r5, r7, r10 |
| rsb r9, r9, #0 |
| smlal r10, r5, r8, r9 |
| movs r10, r10, lsr #28 |
| adc r5, r10, r5, lsl #4 |
| ldmia r2, {r7, r8} |
| add r7, r7, r5 |
| sub r5, r7, r5, lsl #1 |
| add r8, r8, r6 |
| sub r6, r8, r6, lsl #1 |
| stmia r3!, {r5, r6} |
| stmia r2!, {r7, r8} |
| cmp r0, r1 |
| bne .lbut8 |
| add r1, r13, #16 |
| ldr r2, =sincos |
| ldr r3, =sincos2 |
| ldr r0, [r13, #8] |
| mov r0, r0, lsl #2 |
| ldr r4, [r13, #4] |
| add r4, r4, r0 |
| ldr r5, [r13] |
| add r5, r5, #480 |
| add r5, r5, r0 |
| mov r0, #0 |
| .l4: |
| rsb r12, r0, #16 |
| and r12, r12, #15 |
| add lr, r13, #16 |
| add r12, lr, r12, lsl #3 |
| ldmia r1!, {r10, r11} |
| ldmia r12, {r6, r7} |
| add r6, r6, r10 |
| sub r10, r6, r10, lsl #1 |
| add r11, r11, r7 |
| sub r7, r11, r7, lsl #1 |
| ldmia r2!, {r12, lr} |
| smull r9, r8, r11, r12 |
| smlal r9, r8, lr, r10 |
| movs r9, r9, lsr #28 |
| adc r9, r9, r8, lsl #4 |
| smull lr, r8, r11, lr |
| rsb r12, r12, #0 |
| smlal lr, r8, r10, r12 |
| movs lr, lr, lsr #28 |
| adc r8, lr, r8, lsl #4 |
| add r6, r6, r8 |
| sub r8, r6, r8, lsl #1 |
| add r7, r7, r9 |
| sub r9, r7, r9, lsl #1 |
| add lr, r3, #128 |
| ldmia lr, {r10, r11} |
| smull lr, r12, r8, r11 |
| smlal lr, r12, r9, r10 |
| movs lr, lr, lsr #28 |
| adc r12, lr, r12, lsl #4 |
| str r12, [r4], #32 |
| cmp r0, #0 |
| cmpne r0, #8 |
| beq .skip1 |
| smull lr, r12, r8, r10 |
| rsb r9, r9, #0 |
| smlal lr, r12, r9, r11 |
| movs lr, lr, lsr #28 |
| adc r12, lr, r12, lsl #4 |
| add lr, r5, r0, lsl #6 |
| str r12, [lr, #-512] |
| .skip1: |
| ldmia r3!, {r10, r11} |
| smull lr, r12, r7, r10 |
| smlal lr, r12, r6, r11 |
| movs lr, lr, lsr #28 |
| adc r12, lr, r12, lsl #4 |
| str r12, [r5], #-32 |
| cmp r0, #0 |
| cmpne r0, #8 |
| beq .skip2 |
| smull lr, r12, r6, r10 |
| rsb r7, r7, #0 |
| smlal lr, r12, r7, r11 |
| movs lr, lr, lsr #28 |
| adc r12, lr, r12, lsl #4 |
| sub lr, r4, r0, lsl #6 |
| str r12, [lr, #480] |
| .skip2: |
| add r0, r0, #1 |
| cmp r0, #9 |
| bne .l4 |
| add r13, r13, #144 |
| ldmia r13!, {r4, r5, r6, r7, r8, r9, r10, r11, r12, pc} |
| bitrev: |
| .word 0x0 |
| .word 0x2 |
| .word 0x1 |
| .word 0x3 |
| |
| sincos: |
| .word 0x0 |
| .word 0x10000000 |
| .word -0x31f1708 |
| .word 0xfb14be8 |
| .word -0x61f78aa |
| .word 0xec835e8 |
| .word -0x8e39d9d |
| .word 0xd4db315 |
| .word -0xb504f33 |
| .word 0xb504f33 |
| .word -0xd4db315 |
| .word 0x8e39d9d |
| .word -0xec835e8 |
| .word 0x61f78aa |
| .word -0xfb14be8 |
| .word 0x31f1708 |
| .word -0x10000000 |
| .word 0x0 |
| .word -0xfb14be8 |
| .word -0x31f1708 |
| .word -0xec835e8 |
| .word -0x61f78aa |
| .word -0xd4db315 |
| .word -0x8e39d9d |
| .word -0xb504f33 |
| .word -0xb504f33 |
| .word -0x8e39d9d |
| .word -0xd4db315 |
| .word -0x61f78aa |
| .word -0xec835e8 |
| .word -0x31f1708 |
| .word -0xfb14be8 |
| |
| sincos2: |
| .word 0x0 |
| .word 0x8000000 |
| .word 0x647d98 |
| .word 0x7fd8879 |
| .word 0xc8bd36 |
| .word 0x7f62369 |
| .word 0x12c8107 |
| .word 0x7e9d560 |
| .word 0x18f8b84 |
| .word 0x7d8a5f4 |
| .word 0x1f19f98 |
| .word 0x7c29fbf |
| .word 0x25280c6 |
| .word 0x7a7d056 |
| .word 0x2b1f34f |
| .word 0x7884841 |
| .word 0x30fbc55 |
| .word 0x7641af4 |
| .word 0x36ba201 |
| .word 0x73b5ebd |
| .word 0x3c56ba7 |
| .word 0x70e2cbc |
| .word 0x41ce1e6 |
| .word 0x6dca0d1 |
| .word 0x471cece |
| .word 0x6a6d98a |
| .word 0x4c3fdff |
| .word 0x66cf812 |
| .word 0x5133cc9 |
| .word 0x62f201b |
| .word 0x55f5a4d |
| .word 0x5ed77c9 |
| .word 0x5a8279a |
| .word 0x5a8279a |
| .word 0x5ed77c9 |
| .word 0x55f5a4d |
| .word 0x62f201b |
| .word 0x5133cc9 |
| .word 0x66cf812 |
| .word 0x4c3fdff |
| .word 0x6a6d98a |
| .word 0x471cece |
| .word 0x6dca0d1 |
| .word 0x41ce1e6 |
| .word 0x70e2cbc |
| .word 0x3c56ba7 |
| .word 0x73b5ebd |
| .word 0x36ba201 |
| .word 0x7641af4 |
| .word 0x30fbc55 |
| .word 0x7884841 |
| .word 0x2b1f34f |
| .word 0x7a7d056 |
| .word 0x25280c6 |
| .word 0x7c29fbf |
| .word 0x1f19f98 |
| .word 0x7d8a5f4 |
| .word 0x18f8b84 |
| .word 0x7e9d560 |
| .word 0x12c8107 |
| .word 0x7f62369 |
| .word 0xc8bd36 |
| .word 0x7fd8879 |
| .word 0x647d98 |