Enabling the SMUSH/sound ARM optimizations for the iPhone. Converting any numerical expressions in the asm to absolute values (moving the expression to comments) since the iPhone assembler can't handle them, and prepending an underscore to the exported symbols (with some preprocessor magic similar to the hq3x asm for handle ports where it's not needed)

svn-id: r30093
This commit is contained in:
Oystein Eftevaag 2007-12-31 01:50:18 +00:00
parent a38fa007bb
commit 1c88ab2c47
5 changed files with 102 additions and 71 deletions

4
configure vendored
View file

@ -1077,12 +1077,14 @@ if test -n "$_host"; then
;;
iphone)
echo "Cross-compiling to $_host, forcing endianness, alignment and type sizes"
DEFINES="$DEFINES -DIPHONE -DUNIX"
DEFINES="$DEFINES -DIPHONE -DUNIX -DUSE_ARM_SOUND_ASM -DUSE_ARM_SMUSH_ASM"
_endian=little
_need_memalign=yes
type_1_byte='char'
type_2_byte='short'
type_4_byte='int'
add_line_to_config_mk 'USE_ARM_SOUND_ASM = 1'
add_line_to_config_mk 'USE_ARM_SMUSH_ASM = 1'
_backend="iphone"
_mak_hq_scalers='DISABLE_HQ_SCALERS = 1'
_build_hq_scalers="no"

View file

@ -340,6 +340,12 @@ void Codec47Decoder::makeTables47(int width) {
#ifdef USE_ARM_SMUSH_ASM
extern "C" {
#ifndef IPHONE
#define ARM_Smush_decode2 _ARM_Smush_decode2
#endif
}
extern "C" void ARM_Smush_decode2( byte *dst,
const byte *src,
int width,

View file

@ -18,8 +18,8 @@
@ along with this program@ if not, write to the Free Software
@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
@
@ $URL:$
@ $Id:$
@ $URL$
@ $Id$
@
@ @author Robin Watts (robin@wss.co.uk)
@
@ -29,9 +29,9 @@
.text
.global ARM_Smush_decode2
.global _ARM_Smush_decode2
ARM_Smush_decode2:
_ARM_Smush_decode2:
@ r0 = dst
@ r1 = src
@ r2 = width
@ -44,7 +44,7 @@ ARM_Smush_decode2:
@ <> = _tableSmall
STMFD r13!,{r2,r4-r11,R14}
LDR r4,[r13,#(9+1)*4] @ r4 = param
LDR r4,[r13,#40] @ r4 = param (40 = (9+1)*4)
@ stall
@ stall
SUB r4,r4,#0xF8
@ -72,7 +72,7 @@ x_loop:
BEQ level1codeFE
level1codeFD:
LDRB r6,[r1],#1 @ r6 = tmp = *_d_src++
LDR r8,[r13,#(9+1+2)*4] @ r8 = _tableBig
LDR r8,[r13,#48] @ r8 = _tableBig (48 = (9+1+2)*4)
@ stall
ADD r12,r6,r6,LSL #1 @ r12= tmp*3
ADD r6,r6,r12,LSL #5 @ r6 = tmp*97
@ -93,7 +93,7 @@ level1codeFD_loop1:
level1codeFD_over1:
LDRB r9,[r12,#1] @ r9 = l = tmp_ptr[385]
LDRB r6,[r1],#1 @ r6 = val = *_d_src++
SUB r12,r12,#384-128 @ r12= &tmp_ptr[128]
SUB r12,r12,#256 @ r12= &tmp_ptr[128] (256 = 384-128)
@ I don't really believe the next 2 lines are necessary, but...
CMP r9,#0
BEQ level1codeFD_over2
@ -121,13 +121,13 @@ level1_end:
LDMFD r13!,{r2,r4-r11,PC}
level1codeSMALL:
LDR r8,[r13,#(9+1+1)*4] @ r8 = _table
LDR r9,[r13,#(9+1+3)*4] @ r9 = _offset1
LDR r8,[r13,#44] @ r8 = _table (44 = (9+1+1)*4)
LDR r9,[r13,#52] @ r9 = _offset1 (52 = (9+1+3)*4)
MOV r6,r6,LSL #1 @ r6 = code<<1
LDRSH r8,[r8,r6] @ tmp2 = _table[code]
level1codeFC:
@ EQ => FC
LDREQ r9,[r13,#(9+1+4)*4] @ r9 = _offset2
LDREQ r9,[r13,#56] @ r9 = _offset2 (56 = (9+1+4)*4)
MOVEQ r8,#0
SUB r11,r2,#7 @ r11 = _d_pitch-7
ADD r9,r9,r0 @ tmp2 = _d_dst+_offset
@ -212,7 +212,7 @@ level2:
BEQ level2codeFE
level2codeFD:
LDRB r6,[r1],#1 @ r6 = tmp = *_d_src++
LDR r8,[r13,#(9+1+5)*4] @ r8 = _tableSmall
LDR r8,[r13,#60] @ r8 = _tableSmall (60 = (9+1+5)*4)
@ stall
@ stall
ADD r8,r8,r6,LSL #7 @ r8 = _tableSmall + tmp*128
@ -230,7 +230,7 @@ level2codeFD_loop1:
STRB r6,[r10,r11,LSL #8] @ *(_d_dst + (*tmp_ptr2++)) = val
BGT level2codeFD_loop1
level2codeFD_over1:
LDRB r9,[r12,#97-32] @ r9 = l = tmp_ptr[97]
LDRB r9,[r12,#65] @ r9 = l = tmp_ptr[97] (65 = 97-32)
LDRB r6,[r1],#1 @ r6 = val = *_d_src++
@ I don't really believe the next 2 lines are necessary, but...
CMP r9,#0
@ -246,13 +246,13 @@ level2codeFD_loop2:
MOV PC,R14
level2codeSMALL:
LDR r8,[r13,#(9+1+1)*4] @ r8 = _table
LDR r9,[r13,#(9+1+3)*4] @ r9 = _offset1
LDR r8,[r13,#44] @ r8 = _table (44 = (9+1+1)*4)
LDR r9,[r13,#52] @ r9 = _offset1 (52 = (9+1+3)*4)
MOV r6,r6,LSL #1 @ r6 = code<<1
LDRSH r8,[r8,r6] @ tmp2 = _table[code]
level2codeFC:
@ EQ => FC
LDREQ r9,[r13,#(9+1+4)*4] @ r9 = _offset2
LDREQ r9,[r13,#56] @ r9 = _offset2 (56 = (9+1+4)*4)
MOVEQ r8,#0
SUB r11,r2,#3 @ r11 = _d_pitch-3
ADD r9,r9,r0 @ tmp2 = _d_dst + _table[code]
@ -350,13 +350,13 @@ level3codeFF:
MOV PC,R14
level3codeSMALL:
LDR r8,[r13,#(9+1+1)*4] @ r8 = _table
LDR r9,[r13,#(9+1+3)*4] @ r9 = _offset1
LDR r8,[r13,#44] @ r8 = _table (44 = (9+1+1)*4)
LDR r9,[r13,#52] @ r9 = _offset1 (52 = (9+1+3)*4)
MOV r6,r6,LSL #1 @ r6 = code<<1
LDRSH r8,[r8,r6] @ tmp2 = _table[code]
level3codeFC:
@ EQ => FC
LDREQ r9,[r13,#(9+1+4)*4] @ r9 = _offset2
LDREQ r9,[r13,#56] @ r9 = _offset2 (56 = (9+1+4)*4)
MOVEQ r8,#0
ADD r9,r9,r0 @ tmp2 = _d_dst+offset
ADD r8,r8,r9 @ tmp2 = _d_dst+_table[code]+_offset

View file

@ -129,6 +129,14 @@ SimpleRateConverter<stereo, reverseStereo>::SimpleRateConverter(st_rate_t inrate
sr.inLen = 0;
}
extern "C" {
#ifndef IPHONE
#define ARM_SimpleRate_M _ARM_SimpleRate_M
#define ARM_SimpleRate_S _ARM_SimpleRate_S
#define ARM_SimpleRate_R _ARM_SimpleRate_R
#endif
}
extern "C" void ARM_SimpleRate_M(AudioStream &input,
int (*fn)(Audio::AudioStream&,int16*,int),
SimpleRateDetails *sr,
@ -220,6 +228,14 @@ typedef struct {
st_sample_t inBuf[INTERMEDIATE_BUFFER_SIZE];
} LinearRateDetails;
extern "C" {
#ifndef IPHONE
#define ARM_LinearRate_M _ARM_LinearRate_M
#define ARM_LinearRate_S _ARM_LinearRate_S
#define ARM_LinearRate_R _ARM_LinearRate_R
#endif
}
extern "C" void ARM_LinearRate_M(AudioStream &input,
int (*fn)(Audio::AudioStream&,int16*,int),
LinearRateDetails *lr,
@ -323,6 +339,14 @@ fflush(stderr);
/**
* Simple audio rate converter for the case that the inrate equals the outrate.
*/
extern "C" {
#ifndef IPHONE
#define ARM_CopyRate_M _ARM_CopyRate_M
#define ARM_CopyRate_S _ARM_CopyRate_S
#define ARM_CopyRate_R _ARM_CopyRate_R
#endif
}
extern "C" void ARM_CopyRate_M(st_size_t len,
st_sample_t *obuf,
st_volume_t vol_l,
@ -359,7 +383,6 @@ public:
fprintf(stderr, "Copy st=%d rev=%d\n", stereo, reverseStereo);
fflush(stderr);
#endif
st_sample_t *ptr;
st_size_t len;
if (stereo)

View file

@ -29,17 +29,17 @@
.text
.global ARM_CopyRate_M
.global ARM_CopyRate_S
.global ARM_CopyRate_R
.global ARM_SimpleRate_M
.global ARM_SimpleRate_S
.global ARM_SimpleRate_R
.global ARM_LinearRate_M
.global ARM_LinearRate_S
.global ARM_LinearRate_R
.global _ARM_CopyRate_M
.global _ARM_CopyRate_S
.global _ARM_CopyRate_R
.global _ARM_SimpleRate_M
.global _ARM_SimpleRate_S
.global _ARM_SimpleRate_R
.global _ARM_LinearRate_M
.global _ARM_LinearRate_S
.global _ARM_LinearRate_R
ARM_CopyRate_M:
_ARM_CopyRate_M:
@ r0 = len
@ r1 = obuf
@ r2 = vol_l
@ -59,9 +59,9 @@ CopyRate_M_loop:
MUL r5, r3, r5 @ r5 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r14,#1<<31 @ Clamp r6
RSCVS r6, r14,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r14,#1<<31 @ Clamp r7
RSCVS r7, r14,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -74,7 +74,7 @@ CopyRate_M_loop:
LDMFD r13!,{r4-r7,PC}
ARM_CopyRate_S:
_ARM_CopyRate_S:
@ r0 = len
@ r1 = obuf
@ r2 = vol_l
@ -95,9 +95,9 @@ CopyRate_S_loop:
MUL r5, r3, r5 @ r6 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r14,#1<<31 @ Clamp r6
RSCVS r6, r14,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r14,#1<<31 @ Clamp r7
RSCVS r7, r14,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -110,7 +110,7 @@ CopyRate_S_loop:
LDMFD r13!,{r4-r7,PC}
ARM_CopyRate_R:
_ARM_CopyRate_R:
@ r0 = len
@ r1 = obuf
@ r2 = vol_l
@ -131,9 +131,9 @@ CopyRate_R_loop:
MUL r5, r3, r5 @ r5 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r14,#1<<31 @ Clamp r6
RSCVS r6, r14,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r14,#1<<31 @ Clamp r7
RSCVS r7, r14,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -146,7 +146,7 @@ CopyRate_R_loop:
LDMFD r13!,{r4-r7,PC}
ARM_SimpleRate_M:
_ARM_SimpleRate_M:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -183,9 +183,9 @@ SimpleRate_M_read_return:
MUL r5, r14,r5 @ r5 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r10,#1<<31 @ Clamp r6
RSCVS r6, r10,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r10,#1<<31 @ Clamp r7
RSCVS r7, r10,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -201,7 +201,7 @@ SimpleRate_M_end:
STMIA r14,{r0,r1,r2} @ Store back updated values
LDMFD r13!,{r4-r8,r10-r11,PC}
SimpleRate_M_read:
LDR r0, [r13,#4*2] @ r0 = sr
LDR r0, [r13,#8] @ r0 = sr (8 = 4*2)
ADD r0, r0, #16 @ r0 = inPtr = inBuf
.ifdef PALMOS_MODE
LDR r10,[r13,#4*8] @ restore r10
@ -209,14 +209,14 @@ SimpleRate_M_read:
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 3+8+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #1 @ r1 = inLen-1
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT SimpleRate_M_end
@ -229,7 +229,7 @@ SimpleRate_M_read:
B SimpleRate_M_read_return
ARM_SimpleRate_S:
_ARM_SimpleRate_S:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -267,9 +267,9 @@ SimpleRate_S_read_return:
MUL r5, r14,r5 @ r6 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r10,#1<<31 @ Clamp r6
RSCVS r6, r10,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r10,#1<<31 @ Clamp r7
RSCVS r7, r10,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -285,21 +285,21 @@ SimpleRate_S_end:
STMIA r14,{r0,r1,r2} @ store back updated values
LDMFD r13!,{r4-r8,r10-r11,PC}
SimpleRate_S_read:
LDR r0, [r13,#4*2] @ r0 = sr
LDR r0, [r13,#8] @ r0 = sr (8 = 4*2)
ADD r0, r0, #16 @ r0 = inPtr = inBuf
.ifdef PALMOS_MODE
LDR r10,[r13,#4*8] @ restore r10
.endif
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 3+8+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #2 @ r1 = inLen-2
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT SimpleRate_S_end
@ -313,7 +313,7 @@ SimpleRate_S_read:
ARM_SimpleRate_R:
_ARM_SimpleRate_R:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -351,9 +351,9 @@ SimpleRate_R_read_return:
MUL r5, r14,r5 @ r6 = tmp1*vol_r
ADDS r6, r4, r6, LSL #16 @ r6 = obuf[0]<<16 + tmp0*vol_l
RSCVS r6, r10,#1<<31 @ Clamp r6
RSCVS r6, r10,#0x80000000 @ Clamp r6
ADDS r7, r5, r7, LSL #16 @ r7 = obuf[1]<<16 + tmp1*vol_r
RSCVS r7, r10,#1<<31 @ Clamp r7
RSCVS r7, r10,#0x80000000 @ Clamp r7
MOV r6, r6, LSR #16 @ Shift back to halfword
MOV r7, r7, LSR #16 @ Shift back to halfword
@ -369,7 +369,7 @@ SimpleRate_R_end:
STMIA r14,{r0,r1,r2} @ Store back updated values
LDMFD r13!,{r4-r8,r10-r11,PC}
SimpleRate_R_read:
LDR r0, [r13,#4*2] @ r0 = sr
LDR r0, [r13,#8] @ r0 = sr (8 = 4*2)
ADD r0, r0, #16 @ r0 = inPtr = inBuf
.ifdef PALMOS_MODE
LDR r10,[r13,#4*8] @ restore r10
@ -377,14 +377,14 @@ SimpleRate_R_read:
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 3+8+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #2 @ r1 = inLen-2
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT SimpleRate_R_end
@ -397,7 +397,7 @@ SimpleRate_R_read:
B SimpleRate_R_read_return
ARM_LinearRate_M:
_ARM_LinearRate_M:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -450,9 +450,9 @@ LinearRate_M_part2:
MUL r6, r14,r6 @ r6 = tmp1*vol_r
ADDS r7, r7, r4, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l
RSCVS r7, r10, #1<<31 @ Clamp r7
RSCVS r7, r10, #0x80000000 @ Clamp r7
ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r
RSCVS r6, r10, #1<<31 @ Clamp r6
RSCVS r6, r10, #0x80000000 @ Clamp r6
MOV r7, r7, LSR #16 @ Shift back to halfword
MOV r6, r6, LSR #16 @ Shift back to halfword
@ -478,14 +478,14 @@ LinearRate_M_read:
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 2+9+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #1 @ r1 = inLen-1
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT LinearRate_M_end
@ -494,7 +494,7 @@ LinearRate_M_read:
.endif
B LinearRate_M_read_return
ARM_LinearRate_S:
_ARM_LinearRate_S:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -557,9 +557,9 @@ LinearRate_S_part2:
ADDS r7, r7, r10, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l
MOV r4, #0
RSCVS r7, r4, #1<<31 @ Clamp r7
RSCVS r7, r4, #0x80000000 @ Clamp r7
ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r
RSCVS r6, r4, #1<<31 @ Clamp r6
RSCVS r6, r4, #0x80000000 @ Clamp r6
MOV r7, r7, LSR #16 @ Shift back to halfword
MOV r6, r6, LSR #16 @ Shift back to halfword
@ -585,20 +585,20 @@ LinearRate_S_read:
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 2+9+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #2 @ r1 = inLen-2
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT LinearRate_S_end
B LinearRate_S_read_return
ARM_LinearRate_R:
_ARM_LinearRate_R:
@ r0 = AudioStream &input
@ r1 = input.readBuffer
@ r2 = input->sr
@ -661,9 +661,9 @@ LinearRate_R_part2:
ADDS r7, r7, r10, LSL #16 @ r7 = obuf[0]<<16 + tmp0*vol_l
MOV r4, #0
RSCVS r7, r4, #1<<31 @ Clamp r7
RSCVS r7, r4, #0x80000000 @ Clamp r7
ADDS r6, r6, r5, LSL #16 @ r6 = obuf[1]<<16 + tmp1*vol_r
RSCVS r6, r4, #1<<31 @ Clamp r6
RSCVS r6, r4, #0x80000000 @ Clamp r6
MOV r7, r7, LSR #16 @ Shift back to halfword
MOV r6, r6, LSR #16 @ Shift back to halfword
@ -689,14 +689,14 @@ LinearRate_R_read:
STMFD r13!,{r0,r2-r3,r12,r14}
MOV r1, r0 @ r1 = inBuf
LDR r0, [r13,#4*5] @ r0 = AudioStream & input
LDR r0, [r13,#20] @ r0 = AudioStream & input (20 = 4*5)
MOV r2, #512 @ r2 = ARRAYSIZE(inBuf)
@ Calling back into C++ here. WinCE is fairly easy about such things
@ but other OS are more awkward. r9 is preserved for Symbian, and
@ we have 2+9+5 = 16 things on the stack (an even number).
MOV r14,PC
LDR PC,[r13,#4*6] @ inLen = input.readBuffer(inBuf,512)
LDR PC,[r13,#24] @ inLen = input.readBuffer(inBuf,512) (24 = 4*6)
SUBS r1, r0, #2 @ r1 = inLen-2
LDMFD r13!,{r0,r2-r3,r12,r14}
BLT LinearRate_R_end