gpu_unai: redo frameskip
[pcsx_rearmed.git] / plugins / dfsound / arm_utils.s
1 /*
2  * (C) GraÅžvydas "notaz" Ignotas, 2011
3  *
4  * This work is licensed under the terms of any of these licenses
5  * (at your option):
6  *  - GNU GPL, version 2 or later.
7  *  - GNU LGPL, version 2.1 or later.
8  * See the COPYING file in the top-level directory.
9  */
10
11
12 .text
13 .align 2
14
15
16 .global mix_chan @ (int start, int count, int lv, int rv)
17 mix_chan:
18     vmov.32     d14[0], r2
19     vmov.32     d14[1], r3             @ multipliers
20     mov         r12, r0
21     movw        r0, #:lower16:ChanBuf
22     movw        r2, #:lower16:SSumLR
23     movt        r0, #:upper16:ChanBuf
24     movt        r2, #:upper16:SSumLR
25     add         r0, r12, lsl #2
26     add         r2, r12, lsl #3
27 0:
28     vldmia      r0!, {d0-d1}
29     vldmia      r2, {d2-d5}
30     vmul.s32    d10, d14, d0[0]
31     vmul.s32    d11, d14, d0[1]
32     vmul.s32    d12, d14, d1[0]
33     vmul.s32    d13, d14, d1[1]
34     vsra.s32    q1, q5, #14
35     vsra.s32    q2, q6, #14
36     subs        r1, #4
37     blt         mc_finish
38     vstmia      r2!, {d2-d5}
39     bgt         0b
40     nop
41     bxeq        lr
42
43 mc_finish:
44     vstmia      r2!, {d2}
45     cmp         r1, #2
46     vstmiage    r2!, {d3}
47     cmp         r1, #3
48     vstmiage    r2!, {d4}
49     bx          lr
50
51
52 .global mix_chan_rvb @ (int start, int count, int lv, int rv)
53 mix_chan_rvb:
54     vmov.32     d14[0], r2
55     vmov.32     d14[1], r3             @ multipliers
56     mov         r12, r0
57     movw        r0, #:lower16:ChanBuf
58     movw        r3, #:lower16:sRVBStart
59     movw        r2, #:lower16:SSumLR
60     movt        r0, #:upper16:ChanBuf
61     movt        r3, #:upper16:sRVBStart
62     movt        r2, #:upper16:SSumLR
63     ldr         r3, [r3]
64     add         r0, r12, lsl #2
65     add         r2, r12, lsl #3
66     add         r3, r12, lsl #3
67 0:
68     vldmia      r0!, {d0-d1}
69     vldmia      r2, {d2-d5}
70     vldmia      r3, {d6-d9}
71     vmul.s32    d10, d14, d0[0]
72     vmul.s32    d11, d14, d0[1]
73     vmul.s32    d12, d14, d1[0]
74     vmul.s32    d13, d14, d1[1]
75     vsra.s32    q1, q5, #14
76     vsra.s32    q2, q6, #14
77     vsra.s32    q3, q5, #14
78     vsra.s32    q4, q6, #14
79     subs        r1, #4
80     blt         mcr_finish
81     vstmia      r2!, {d2-d5}
82     vstmia      r3!, {d6-d9}
83     bgt         0b
84     nop
85     bxeq        lr
86
87 mcr_finish:
88     vstmia      r2!, {d2}
89     vstmia      r3!, {d6}
90     cmp         r1, #2
91     vstmiage    r2!, {d3}
92     vstmiage    r3!, {d7}
93     cmp         r1, #3
94     vstmiage    r2!, {d4}
95     vstmiage    r3!, {d8}
96     bx          lr
97
98 @ vim:filetype=armasm