G
Ganesh Tawde
Hi.
I am trying to use the below pure assembly code as inline assembly in
C. The pure assembly code gives proper data but the inline assembly
code gives me distorted data. I am not able to figure out the problem.
can any body help me on this?
here is the working pure assembly function
*************************************************************************
@AREA ARM , CODE ,READONLY
@;--------------------------------------------------------------
@ ;dec2 assembly code called from res2_inv.c
@;--------------------------------------------------------------
.global dec2
dec2:
stmdb r13!, {r4-r12, lr}
ldmia r3!,{r6,r7}
mov r14,r7 @n
mov r8,r6 @shift
mov r3,r8
dec2loop:
ldmgeda r2!, {r12}
ldmgeia r12!, {r8, r9}
ldmgeia r0, {r4, r5}
ldmgeia r1, {r6, r7}
add r4,r4,r8, asr r3
add r6,r6,r9, asr r3
ldmgeda r2!, {r12}
ldmgeia r12!, {r8, r9}
add r5,r5,r8, asr r3
add r7,r7,r9, asr r3
stmgeia r0!, {r4, r5}
stmgeia r1!, {r6, r7}
subs r14, r14, #2
bne dec2loop
ldmia r13!, {r4-r12,pc}
*************************************************************************
and here is the C inline function .. not working
*************************************************************************
void dec2 (int *a0, int *a1, int *t[], int *param);
void dec2 (int *a0, int *a1, int *t[], int *param)
{
asm (
"stmdb r13!, {r4-r12, lr}\n\t"
"ldmia %5!, {r6,r7}\n\t"
"mov r14, r7\n\t"
"mov r8, r6\n\t"
"mov r3, r8\n\t"
"loop:\n\t"
"ldmgeda %4!, {r12}\n\t"
"ldmgeia r12!, {r8, r9}\n\t"
"ldmgeia %2, {r4, r5}\n\t"
"ldmgeia %3, {r6, r7}\n\t"
"add r4,r4,r8, asr r3n\t"
"add r6,r6,r9, asr r3n\t"
"ldmgeda %4!, {r12}\n\t"
"ldmgeia r12!, {r8, r9}\n\t"
"add r5,r5,r8, asr r3\n\t"
"add r7,r7,r9, asr r3\n\t"
"stmgeia %0!, {r4, r5}\n\t"
"stmgeia %1!, {r6, r7}\n\t"
"subs r14, r14, #2\n\t"
"bne loop\n\t"
"ldmia r13!, {r4-r12,pc}\n\t"
:"=r"(a0), "=r"(a1)
:"0"(a0), "1"(a1), "r"(t), "r"(param)
:"r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "r14"
);
}
*************************************************************************
Thanks in advance
Ganesh
I am trying to use the below pure assembly code as inline assembly in
C. The pure assembly code gives proper data but the inline assembly
code gives me distorted data. I am not able to figure out the problem.
can any body help me on this?
here is the working pure assembly function
*************************************************************************
@AREA ARM , CODE ,READONLY
@;--------------------------------------------------------------
@ ;dec2 assembly code called from res2_inv.c
@;--------------------------------------------------------------
.global dec2
dec2:
stmdb r13!, {r4-r12, lr}
ldmia r3!,{r6,r7}
mov r14,r7 @n
mov r8,r6 @shift
mov r3,r8
dec2loop:
ldmgeda r2!, {r12}
ldmgeia r12!, {r8, r9}
ldmgeia r0, {r4, r5}
ldmgeia r1, {r6, r7}
add r4,r4,r8, asr r3
add r6,r6,r9, asr r3
ldmgeda r2!, {r12}
ldmgeia r12!, {r8, r9}
add r5,r5,r8, asr r3
add r7,r7,r9, asr r3
stmgeia r0!, {r4, r5}
stmgeia r1!, {r6, r7}
subs r14, r14, #2
bne dec2loop
ldmia r13!, {r4-r12,pc}
*************************************************************************
and here is the C inline function .. not working
*************************************************************************
void dec2 (int *a0, int *a1, int *t[], int *param);
void dec2 (int *a0, int *a1, int *t[], int *param)
{
asm (
"stmdb r13!, {r4-r12, lr}\n\t"
"ldmia %5!, {r6,r7}\n\t"
"mov r14, r7\n\t"
"mov r8, r6\n\t"
"mov r3, r8\n\t"
"loop:\n\t"
"ldmgeda %4!, {r12}\n\t"
"ldmgeia r12!, {r8, r9}\n\t"
"ldmgeia %2, {r4, r5}\n\t"
"ldmgeia %3, {r6, r7}\n\t"
"add r4,r4,r8, asr r3n\t"
"add r6,r6,r9, asr r3n\t"
"ldmgeda %4!, {r12}\n\t"
"ldmgeia r12!, {r8, r9}\n\t"
"add r5,r5,r8, asr r3\n\t"
"add r7,r7,r9, asr r3\n\t"
"stmgeia %0!, {r4, r5}\n\t"
"stmgeia %1!, {r6, r7}\n\t"
"subs r14, r14, #2\n\t"
"bne loop\n\t"
"ldmia r13!, {r4-r12,pc}\n\t"
:"=r"(a0), "=r"(a1)
:"0"(a0), "1"(a1), "r"(t), "r"(param)
:"r3", "r4", "r5", "r6", "r7", "r8", "r9", "r12", "r14"
);
}
*************************************************************************
Thanks in advance
Ganesh