[an error occurred while processing this directive]
c55xx - глюки встроенной функции? компилятора? или мои?...
(«Телесистемы»: Конференция «Цифровые сигнальные процессоры (DSP) и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено Oleg_0515 30 августа 2004 г. 17:44

Проблема: При попытке откомпилировать и отсимулировать простенький примерчик в среде CCS 2.12.00 FULL + C55xx CSL 2.31.00.5 получаются откровенные пни в ассемблерном коде.
Может быть я что-то не так делаю?

Подробное описание:
1. Имеется многим известная си-функция, встречающаяся во многих исходниках серии G.XXX (и не только).

======================= Функция прототип =====================
/*
Function Name : L_shr_r
Purpose :
Same as L_shr(L_var1,var2)but with rounding. Saturate the result in case of underflows or overflows.
If var2 is greater than zero :
L_shr_r(var1,var2) = L_shr(L_add(L_var1,2**(var2-1)),var2)
If var2 is less than zero :
L_shr_r(var1,var2) = L_shr(L_var1,var2).
Complexity weight : 3
Inputs : L_var1
32 bit long signed integer (Word32) whose value falls in the
range : 0x8000 0000 <= var1 <= 0x7fff ffff.
var2
16 bit short signed integer (Word16) whose value falls in the
range : 0xffff 8000 <= var1 <= 0x0000 7fff.
Outputs : none
Return Value :
L_var_out
32 bit long signed integer (Word32) whose value falls in the
range : 0x8000 0000 <= var_out <= 0x7fff ffff.
*/
Word32 L_shr_r(Word32 L_var1,Word16 var2)
{
Word32 L_var_out;
if (var2 > 31) { L_var_out = 0; }
else
{
L_var_out = L_shr(L_var1,var2);
if (var2 > 0)
{
if ( (L_var1 & ( (Word32)1 << (var2-1) )) != 0) {L_var_out++;}
}
}
return(L_var_out);
}

2. В модуле gsm.h среди прочего интересного можно найти пример макроса L_shr_r, вызывающего встроенную функцию L_crshft_r:
...
/*----------------------------------------------------------------*/
/* Mappings for ETSI functions to built-in compiler intrinsics */
/*---------------------------------------------------------------*/
...
#define L_shr_r(a,b) (L_crshft_r((a),(b)))
...

/*----------------------------------------------------------------*/
/* Declarations for ETSI functions implemented as function calls (or */
/* inline functions) */
/*--------------------------------------------------------------*/
...
long L_crshft_r(long x, int y);
...

3. Для проверки предлагаемого решения был написан маленький модуль:

=========================== модуль main.c =========================
#include "c55x.h"
#define L_shr_r(a,b) (L_crshft_r((a),(b)))
long a32=0x0FFF1238, c32, d32;
int b16=16;
void main(void)
{
c32=L_shr_r(a32,-16);
d32=L_shr_r(a32,4);
}

4. Симуляция показывает, что считается все честно, но при выходе из п/п "_L_crshft_r" результат остается в AC0, после возврата в основной модуль результат нагло затирается командой "MOV T0,AC0", после чего этот хлам переписывается в требуемую ячейку командой "MOV AC0,dbl(*abs16(#00c8h))" или "MOV AC0,dbl(*abs16(#00cah))" во втором случае.

Фрагменты кода далее.
Вопрос: Ну и как это называется и что знатоки посоветуют?

======================== фрагмент Mixed Mode =======================
02025A main:
02025A 4EFF AADD - #1,SP

c32=L_shr_r(a32,-16);

02025C ED110800C6 MOV dbl(*abs16(#00c6h)),AC0
020261 76FFF048 MOV #-16,T0
020265 6C0202C4 CALL _L_crshft_r
020269 2240 MOV T0,AC0
02026B EB110800C8 MOV AC0,dbl(*abs16(#00c8h))

d32=L_shr_r(a32,4);

020270 ED110800C6 MOV dbl(*abs16(#00c6h)),AC0
020275 6C0202C4 3D44 CALL _L_crshft_r || MOV #4,T0
02027B 2240 MOV T0,AC0
02027D EB110800CA MOV AC0,dbl(*abs16(#00cah))

================= Фрагмент окна дизассемблера ======================

0202C4 _L_crshft_r:
0202C4 4EFF AADD - #1,SP
0202C6 6F48201D BCC 0x0202e7,T0 >= #32
0202CA 3445 NEG T0,T1
0202CC 4693 BSET ST1_OVM
0202CE 5C85 SFTS AC0,T1,AC2
0202D0 4692 BCLR ST1_OVM
0202D2 3455 NEG T1,T1
0202D4 043512 BCC 0x0202e9,T1 <= #0
0202D7 4215 SUB #1,T1
0202D9 3C11 MOV #1,AC1
0202DB 5C55 SFTS AC1,T1,AC1
0202DD 2810 AND AC1,AC0
0202DF 6400 BCC 0x0202e9,AC0 == #0
0202E1 7B000102 ADD #1,AC2,AC0
0202E5 4A04 B 0x0202eb
0202E7 3C02 MOV #0,AC2
0202E9 2220 MOV AC2,AC0
0202EB 4E01 AADD + #1,SP
0202ED 4804 RET
=================================================================

Составить ответ  |||  Конференция  |||  Архив

Ответы


Отправка ответа

Имя (обязательно): 
Пароль: 
E-mail: 

Тема (обязательно):
Сообщение:

Ссылка на URL: 
Название ссылки: 

URL изображения: 


Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru