реклама на сайте
подробности

 
 
> Математика в CORTEX на GCC, Длинные сложения и умножения
Tanker
сообщение Sep 19 2009, 13:46
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 30-06-07
Пользователь №: 28 806



Здравствуйте!
по скольку стандартных средств языка Си для подобных действий нет, прошу научить или подсказать, как на GCC под CORTEX написать следующй код:
1) нужно сложить целые числа: 32bit + 16bit и проконтролировать переполнение при сложении
2) нужно умножить целые числа: 32bit х 16bit и проконтролировать переполнение при умножении

в описании инструкций Cortex такие штуки есть и довольно эффекивные на первый взляд, как их в GCC интегрировать?

С уважением.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 4)
zltigo
сообщение Sep 19 2009, 14:08
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



На выбор:
1. 64 бита
2. Ассемблер


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post
Diz
сообщение Sep 19 2009, 14:18
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 84
Регистрация: 1-08-06
Пользователь №: 19 250



Inline assembler, обернутый в inline-функцию.

Например, для ARM7 сложение с ограничением:
Код
static inline long sat_add( long Mac, long Add)
{
    long Out;
    __asm__(
            "   adds  %0, %1, %2"              "\n\t"
            "   movvs %0, %0, asr #31 "     "\n\t"  // Move 0 or ~0
            "   eorvs %0, %0, #(1 << 31)"   "\n\t"  // Craft 0x7FFFFFFF or 0x80000000
            :  "=r" (Out)
            :  "r" (Mac), "r"(Add)
            :  "cc"
        );
    return Out;
}
Go to the top of the page
 
+Quote Post
Tanker
сообщение Sep 19 2009, 16:13
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 34
Регистрация: 30-06-07
Пользователь №: 28 806



Цитата(Diz @ Sep 19 2009, 17:18) *
Inline assembler, обернутый в inline-функцию.
Например, для ARM7 сложение с ограничением:

Круто!!!
я использовал long long ибо не шарю в as для арма
строку типа e.Q += d; (к 64бит(QWORD) прибавить 16бит) компилер разворачивает в 10 срок кода при -О3 явно действуя не оптимально.
Что выкурить чтобы так же програмить в инлайн асм функциях?
на вскидку - не понял передачу параметров и возврат результата

С уважением!
Я когда-то много програмил на FreePascal для x86, там тоже была возможность кодить именно в таком (как Вы продемонстрировали) стиле инлайны на асме (в доке было написано что это типа кроссплатформенный асм) но я это дело манал, указывал $asmmode intel и фигачил в привычном стиле, вот и не научился... а щас под арм пишу всякие фильтры с математикой на фиксированной точке, значит буду асм осваивать дабы перфоманс получить.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 19 2009, 18:40
Сообщение #5


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Tanker @ Sep 19 2009, 22:13) *
Что выкурить чтобы так же програмить в инлайн асм функциях?


http://www.ethernut.de/en/documents/arm-inline-asm.html


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 02:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.0138 секунд с 7
ELECTRONIX ©2004-2016