Перейти к содержанию
    

заинлайнить ассемблерную функцию

Хочется, чтобы функция, написанная на асме была inline.

Я понимаю, что сама функция содержид код, который расчитан на call, но всё-же

Какие есть методы?

inline assembler, скажете вы и будете правы.

Может быть я не совсем понимаю как им воспользоваться....

К примеру возьмем что-то вроде:

float inner_prod(const float *x, const float *y, int len)
{
   float sum=0;
   len >>= 2;
   while(len--)
   {
      spx_word32_t part=0;
      part = part + *x++ * *y++;
      part = part + *x++ * *y++;
      part = part + *x++ * *y++;
      part = part + *x++ * *y++;
      /* HINT: If you had a 40-bit accumulator, you could shift only at the end */
      sum = sum + part;
   }
   return sum;
}

void pitch_xcorr(const float *_x, const float *_y, float*corr, int len, int nb_pitch, char *stack)
{
   int i;
   for (i=0;i<nb_pitch;i++)
   {
      /* Compute correlation*/
      corr[nb_pitch-1-i]=inner_prod(_x, _y+i, len);
   }
}

inner_prod я реализовал на асме, но pitch_xcorr теперь её будет вызывать, теряя лишние циклы, тут бы её как-нибудь заинлайнить...

Метод влоб: переписать ещё и pitch_xcorr и в нужное место вставить код inner_prod и нибудет никакого call. Так я и сделал, но хочется сделать это красивее, элегантнее, что-ли ))

 

Может вставить inline asm на её место. Только ведь я не знаю какие регистры сейчас использует компилятор под конкретные переменные...Некоторые операции требуют только определённых регистров и никаких других. Т.е. в asm("") я напишу что-то вроде

RPT        *-SP[2]
|| MACF32 R7H, R3H, *XAR4++, *XAR7++

но оно не будет работать, т.к. до этого, нужно чтобы XAR7 содержал именно то, что должен содержать.

 

Как с этим бороться? До этого как-то подготовить регистры...я не знаю..должен быть какой-то простой выхот. В gcc, я смотрю, вообще асм интересный, вот там эта проблема решается проще, компилятор сам подставляет нужные регистры, ему нужно только подсказать какого типа регистр тут нужен.

 

Проц TMS320F28335

CCS 3.3

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

а записать нужную функцию макросом или дефайном не получится?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

На самом деле, думается мне, что накладные расходы на собственно вызов функции не так уж и велик. Прилично можно выиграть на оптимизации самого вызова функции. Первое что бросается в глаза, у функции 3 параметра, а реально в цикле меняется только один. Значит два параметра зазря каждый раз запихиваются в стек. Может для тестирования есть смысл, для сравнения, сделать эту функцию без параметров, а сами значения сделать глобальными. Второе. Тип float действительно нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...