1
0
Fork 0
forked from len0rd/rockbox
foxbox/apps/plugins/sdl/progs/quake/snd_mix_generic_annotated.s
Franklin Wei 5d05b9d3e9 Quake!
This ports id Software's Quake to run on the SDL plugin runtime. The
source code originated from id under the GPLv2 license. I used
https://github.com/ahefner/sdlquake as the base of my port.

Performance is, unsurprisingly, not on par with what you're probably
used to on PC. I average about 10FPS on ipod6g, but it's still
playable.

Sound works well enough, but in-game music is not supported. I've
written ARM assembly routines for the inner sound loop. Make sure you
turn the "brightness" all the way down, or colors will look funky.

To run, extract Quake's data files to /.rockbox/quake. Have fun!

Change-Id: I4285036e967d7f0722802d43cf2096c808ca5799
2019-07-19 22:37:40 -04:00

191 lines
7 KiB
ArmAsm

.cpu arm926ej-s
.fpu softvfp
.eabi_attribute 20, 1
.eabi_attribute 21, 1
.eabi_attribute 23, 3
.eabi_attribute 24, 1
.eabi_attribute 25, 1
.eabi_attribute 26, 1
.eabi_attribute 30, 2
.eabi_attribute 18, 4
.file "snd_mix_generic.c"
@ GNU C (GCC) version 4.4.4 (arm-elf-eabi)
@ compiled by GNU C version 4.8.2 20140206 (prerelease), GMP version 4.3.2, MPFR version 2.4.2.
@ GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
@ options passed: -imultilib arm926ej-s -D__USES_INITFINI__
@ ./snd_mix_generic.c -mcpu=arm926ej-s -O3 -fverbose-asm
@ options enabled: -falign-loops -fargument-alias -fauto-inc-dec
@ -fbranch-count-reg -fcaller-saves -fcommon -fcprop-registers
@ -fcrossjumping -fcse-follow-jumps -fdefer-pop
@ -fdelete-null-pointer-checks -fearly-inlining
@ -feliminate-unused-debug-types -fexpensive-optimizations
@ -fforward-propagate -ffunction-cse -fgcse -fgcse-after-reload -fgcse-lm
@ -fguess-branch-probability -fident -fif-conversion -fif-conversion2
@ -findirect-inlining -finline -finline-functions
@ -finline-functions-called-once -finline-small-functions -fipa-cp
@ -fipa-cp-clone -fipa-pure-const -fipa-reference -fira-share-save-slots
@ -fira-share-spill-slots -fivopts -fkeep-static-consts
@ -fleading-underscore -fmath-errno -fmerge-constants -fmerge-debug-strings
@ -fmove-loop-invariants -fomit-frame-pointer -foptimize-register-move
@ -foptimize-sibling-calls -fpeephole -fpeephole2 -fpredictive-commoning
@ -freg-struct-return -fregmove -freorder-blocks -freorder-functions
@ -frerun-cse-after-loop -fsched-interblock -fsched-spec
@ -fsched-stalled-insns-dep -fschedule-insns -fschedule-insns2
@ -fsection-anchors -fsigned-zeros -fsplit-ivs-in-unroller
@ -fsplit-wide-types -fstrict-aliasing -fstrict-overflow -fthread-jumps
@ -ftoplevel-reorder -ftrapping-math -ftree-builtin-call-dce -ftree-ccp
@ -ftree-ch -ftree-copy-prop -ftree-copyrename -ftree-cselim -ftree-dce
@ -ftree-dominator-opts -ftree-dse -ftree-fre -ftree-loop-im
@ -ftree-loop-ivcanon -ftree-loop-optimize -ftree-parallelize-loops=
@ -ftree-pre -ftree-reassoc -ftree-scev-cprop -ftree-sink -ftree-sra
@ -ftree-switch-conversion -ftree-ter -ftree-vect-loop-version
@ -ftree-vectorize -ftree-vrp -funit-at-a-time -funswitch-loops
@ -fverbose-asm -fzero-initialized-in-bss -mlittle-endian -msched-prolog
@ Compiler executable checksum: 6bc9eb36ed7f27ae4e8601da7e401eb4
.text
.align 2
.global SND_PaintChannelFrom8
.type SND_PaintChannelFrom8, %function
SND_PaintChannelFrom8:
// r0: true_lvol
// r1: true_rvol
// r2: *sfx
// r3: count
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
cmp r3, #0 @ count
stmfd sp!, {r4, r5, r6, r7, r8, sl} @,
ble .L10 @, // exit early if count <= 0
ldr ip, .L13 @ tmp207, // ip = paintbuffer
ldr r5, .L13+4 @ tmp224, // r5 = 32767
ldr ip, [ip, #0] @ ivtmp.61, paintbuffer // ip = &paintbuffer
// this does {rvol,lvol} &= 0xffff in a really convoluted way
mov r1, r1, asl #16 @ tmp206, true_rvol, // r1 = rvol << 16
mov r0, r0, asl #16 @ tmp205, true_lvol, // r0 = lvol << 16
mov r6, r1, lsr #16 @ pretmp.46, tmp206, // rvol_16 = r1 >> 16
mov r7, r0, lsr #16 @ pretmp.44, tmp205, // lvol_16 = r0 >> 16
mov r1, #0 @ i, // i = 0
// loop?
.L9:
ldrsb r0, [r2, r1] @ tmp208,* i // r0 = (byte) sfx[i]
ldrsh r8, [ip, #0] @ tmp213,* ivtmp.61 // r8 = (int16) paintbuffer[0]
// r0 &= 0xffff
mov r0, r0, asl #16 @ tmp209, tmp208, // r0 <<= 16
mov r0, r0, lsr #16 @ D.1289, tmp209, // r0 >>= 16
mul r4, r0, r7 @ tmp210, D.1289, pretmp.44 // r4 = sfx[i] * (lvol_16)
mov r4, r4, asl #16 @ tmp212, tmp210, // r4 <<= 16
add r4, r8, r4, asr #16 @, val, tmp213, tmp212, // r8 += r4 & 0xffff
// handle saturation
cmp r4, r5 @ val, tmp224 // compare r4, 32767
ldrgt r8, .L13+4 @ D.1341, // r8 = 32767 if saturated
bgt .L4 @, // jump to .L4 if saturated
cmn r4, #32768 @ val, // compare r4, -32768
movge r4, r4, asl #16 @ tmp216, val, // if not saturated, &= 0xffff
movlt r8, #32768 @ D.1341, // r8 = -32768 if saturated
movge r8, r4, lsr #16 @ D.1341, tmp216, // r8 = val
// r8 is final value of paintbuffer[2*i+0]
// now handle right channel
.L4:
// sl is scaled right channel
// this does paintbuffer[1] += rvol * sfx[i]
mul sl, r0, r6 @ tmp217, D.1289, pretmp.46 // sl = sfx[i] * rvol_16
ldrsh r4, [ip, #2] @ tmp220, // r4 = paintbuffer[1]
mov r0, sl, asl #16 @ tmp219, tmp217, // r0 = sl << 16
add r0, r4, r0, asr #16 @, val, tmp220, tmp219, // r0 = r4 + (r0 >> 16)
// now saturate
cmp r0, r5 @ val, tmp224 // compare final right channel to 32767
strh r8, [ip, #0] @ movhi @ D.1341,* ivtmp.61 // write left channel back to paintbuffer
ldrgt r0, .L13+4 @ D.1348, // r0 = 32767 if saturated
bgt .L7 @, // skip to .L7
cmn r0, #32768 @ val, // check < -32768
movge r0, r0, asl #16 @ tmp223, val, // <<= 16 if not saturated
movlt r0, #32768 @ D.1348, // if < -32768, saturate
movge r0, r0, lsr #16 @ D.1348, tmp223, // >>= 16 if not saturated
.L7:
add r1, r1, #1 @ i, i, // i++
cmp r1, r3 @ i, count // i =? count
strh r0, [ip, #2] @ movhi @ D.1348 , // store right channel to paintbuffer
add ip, ip, #4 @ ivtmp.61, ivtmp.61, // paintbuffer += 4 bytes
bne .L9 @, // restart if i != count
.L10:
ldmfd sp!, {r4, r5, r6, r7, r8, sl} // pop stack
bx lr // return
.L14:
.align 2
.L13:
.word paintbuffer
.word 32767
.size SND_PaintChannelFrom8, .-SND_PaintChannelFrom8
.align 2
.global SND_PaintChannelFrom16
.type SND_PaintChannelFrom16, %function
SND_PaintChannelFrom16:
@ args = 0, pretend = 0, frame = 0
@ frame_needed = 0, uses_anonymous_args = 0
@ link register save eliminated.
cmp r3, #0 @ count
stmfd sp!, {r4, r5, r6, r7, r8, sl} @,
ble .L24 @,
ldr ip, .L26 @ tmp146,
ldr r7, .L26+4 @ tmp164,
ldr ip, [ip, #0] @ ivtmp.119, paintbuffer
mov r4, #0 @ i,
.L23:
mov r5, r4, asl #1 @ tmp147, i,
ldrsh r5, [r2, r5] @ data,
ldrsh r8, [ip, #0] @ tmp152,* ivtmp.119
mul r6, r5, r0 @ tmp148, data, true_lvol
mov r6, r6, asl #8 @ tmp151, tmp148,
add r6, r8, r6, asr #16 @, val, tmp152, tmp151,
cmp r6, r7 @ val, tmp164
ldrgt r8, .L26+4 @ D.1355,
bgt .L18 @,
cmn r6, #32768 @ val,
movge r6, r6, asl #16 @ tmp155, val,
movlt r8, #32768 @ D.1355,
movge r8, r6, lsr #16 @ D.1355, tmp155,
.L18:
mul sl, r5, r1 @ tmp156, data, true_rvol
ldrsh r6, [ip, #2] @ tmp160,
mov r5, sl, asl #8 @ tmp159, tmp156,
add r5, r6, r5, asr #16 @, val, tmp160, tmp159,
cmp r5, r7 @ val, tmp164
strh r8, [ip, #0] @ movhi @ D.1355,* ivtmp.119
ldrgt r5, .L26+4 @ D.1362,
bgt .L21 @,
cmn r5, #32768 @ val,
movge r5, r5, asl #16 @ tmp163, val,
movlt r5, #32768 @ D.1362,
movge r5, r5, lsr #16 @ D.1362, tmp163,
.L21:
add r4, r4, #2 @ i, i,
cmp r3, r4 @ count, i
strh r5, [ip, #2] @ movhi @ D.1362,
add ip, ip, #8 @ ivtmp.119, ivtmp.119,
bgt .L23 @,
.L24:
ldmfd sp!, {r4, r5, r6, r7, r8, sl}
bx lr
.L27:
.align 2
.L26:
.word paintbuffer
.word 32767
.size SND_PaintChannelFrom16, .-SND_PaintChannelFrom16
.ident "GCC: (GNU) 4.4.4"