aboutsummaryrefslogtreecommitdiff
path: root/plugins
diff options
context:
space:
mode:
authornotaz2011-10-29 01:09:36 +0300
committernotaz2011-10-30 23:48:09 +0200
commit3a721c1f5582bac7475788bb0018207a3deb2bca (patch)
tree580833ff46b81bc84235ca48d0cc14493e8fcb9b /plugins
parentfaf2b2aae80c811f778f7cfa9a320dd7ade01dac (diff)
downloadpcsx_rearmed-3a721c1f5582bac7475788bb0018207a3deb2bca.tar.gz
pcsx_rearmed-3a721c1f5582bac7475788bb0018207a3deb2bca.tar.bz2
pcsx_rearmed-3a721c1f5582bac7475788bb0018207a3deb2bca.zip
spu: add asm mixing code for ARMv5 too
Diffstat (limited to 'plugins')
-rw-r--r--plugins/dfsound/arm_utils.s63
-rw-r--r--plugins/dfsound/spu.c4
2 files changed, 65 insertions, 2 deletions
diff --git a/plugins/dfsound/arm_utils.s b/plugins/dfsound/arm_utils.s
index 6d3c974..70ff24d 100644
--- a/plugins/dfsound/arm_utils.s
+++ b/plugins/dfsound/arm_utils.s
@@ -12,6 +12,8 @@
.text
.align 2
+@ XXX: should be HAVE_NEON
+.if HAVE_ARMV7
.global mix_chan @ (int start, int count, int lv, int rv)
mix_chan:
@@ -95,4 +97,65 @@ mcr_finish:
vstmiage r3!, {d8}
bx lr
+.else
+
+.global mix_chan @ (int start, int count, int lv, int rv)
+mix_chan:
+ stmfd sp!, {r4-r8,lr}
+ orr r3, r2, r3, lsl #16
+ lsl r3, #1 @ packed multipliers << 1
+ mov r12, r0
+ ldr r0, =ChanBuf
+ ldr r2, =SSumLR
+ add r0, r12, lsl #2
+ add r2, r12, lsl #3
+0:
+ ldmia r0!, {r4,r5}
+ ldmia r2, {r6-r8,lr}
+ lsl r4, #1 @ adjust for mul
+ lsl r5, #1
+ smlawb r6, r4, r3, r6
+ smlawt r7, r4, r3, r7
+ smlawb r8, r5, r3, r8
+ smlawt lr, r5, r3, lr
+ subs r1, #2
+ blt mc_finish
+ stmia r2!, {r6-r8,lr}
+ bgt 0b
+ ldmeqfd sp!, {r4-r8,pc}
+
+mc_finish:
+ stmia r2!, {r6,r7}
+ ldmfd sp!, {r4-r8,pc}
+
+
+.global mix_chan_rvb @ (int start, int count, int lv, int rv)
+mix_chan_rvb:
+ stmfd sp!, {r4-r8,lr}
+ orr lr, r2, r3, lsl #16
+ lsl lr, #1
+ ldr r3, =sRVBStart
+ ldr r2, =SSumLR
+ ldr r4, =ChanBuf
+ ldr r3, [r3]
+ add r2, r2, r0, lsl #3
+ add r3, r3, r0, lsl #3
+ add r0, r4, r0, lsl #2
+0:
+ ldr r4, [r0], #4
+ ldmia r2, {r6,r7}
+ ldmia r3, {r8,r12}
+ lsl r4, #1
+ smlawb r6, r4, lr, r6 @ supposedly takes single cycle?
+ smlawt r7, r4, lr, r7
+ smlawb r8, r4, lr, r8
+ smlawt r12,r4, lr, r12
+ subs r1, #1
+ stmia r2!, {r6,r7}
+ stmia r3!, {r8,r12}
+ bgt 0b
+ ldmfd sp!, {r4-r8,pc}
+
+.endif
+
@ vim:filetype=armasm
diff --git a/plugins/dfsound/spu.c b/plugins/dfsound/spu.c
index ecc7ca0..d26fa96 100644
--- a/plugins/dfsound/spu.c
+++ b/plugins/dfsound/spu.c
@@ -623,8 +623,8 @@ static int do_samples_noise(int ch, int ns, int ns_to)
return -1;
}
-#ifdef __ARM_ARCH_7A__
-// asm code
+#ifdef __arm__
+// asm code; lv and rv must be 0-3fff
extern void mix_chan(int start, int count, int lv, int rv);
extern void mix_chan_rvb(int start, int count, int lv, int rv);
#else