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

 
 
> gcc 4.2.2 и умножение int 16x16
_Pasha
сообщение May 29 2008, 03:47
Сообщение #1


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Доброго времени!
Подскажите, как заставить компилятор в Winavr генерить правильный код.
Нужно
Код
int16_t Xarg,Yarg,Zarg;
........................
Zarg= (Xarg*Yarg) >>16;


Приведение к 32-битам - это безумное количество кода.
Надо, чтоб генерился код примерно такой (имена регистров не важны):
Код
lds r16,Xarg
lds r17,Xarg+1
lds r18,Yarg
lds r19,Yarg+1
clr r6 //9
// дальше стандартное знаковое умножение
muls r17,19
movw r4,r0
mul 16,r18
movw r2,r0
mulsu r19,r16
sbc r5,r6
add r3,r0
adc r4,r1
adc r5,r6
mulsu r17,r18
sbc r5,r6
add r3,r0
adc r4,r1
adc r5,r6
// и выделение старшей части 32-битного результата
sts Zarg,r4
sts Zarg+1,r5
// итого 22+9 = 31 такт


Бился головой о стену - ниасилил компилер такой красоты. А очень надо. Если кто уже получал такое чистым Си, поделитесь, пожалуйста, опытом.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
AHTOXA
сообщение Jun 3 2008, 17:20
Сообщение #2


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

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



Я добрался до АВРки, продолжаюsmile.gif

Урезал осетра, запустил цикл с -32767...
Упс, при a = -32766 и b = 128 пишет:
ошибка, i1 = -16382, i2 = 49153.
Я в шокеsmile.gif Проверяю на куркуляторе - должно получиться -16383. Окей, ещё одна дырочка в области применения. Но это ерундаsmile.gif
Интереснее другое: как выражение
Код
i2 = (signed long)i*b/256;
при i = -32766 и b = 128 дало 49153?!

проверял с
avr-gcc.exe (GCC) 4.3.0 20080111 (experimental)
avr-gcc.exe (GCC) 4.4.0 20080530 (experimental) от klen-a
и
avr-gcc.exe (GCC) 4.1.2 (WinAVR 20070525)

Это опять я глючу, или таки бага компилятора?


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
aesok
сообщение Jun 3 2008, 18:57
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 596
Регистрация: 26-05-06
Из: Москва
Пользователь №: 17 484



Цитата(AHTOXA @ Jun 3 2008, 21:20) *
Интереснее другое: как выражение
Код
i2 = (signed long)i*b/256;
при i = -32766 и b = 128 дало 49153?!

Ничего интересного: 49153 это 0xC001 или -16383.

Убери unsigned из объявления переменой i2.

Анатолий.

PS: В следующий раз посылайте тестовые примеры полностью, с объявлениями перемеренных.

Цитата(_Pasha @ Jun 3 2008, 22:49) *
Это глюки не компилера, а отладчика, в котором Вы все это смотрели.


Это глюки не отладчика а програмера. Надо правильно выбирать типы переменных.

Сообщение отредактировал aesok - Jun 3 2008, 18:58
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Pasha   gcc 4.2.2 и умножение int 16x16   May 29 2008, 03:47
- - aesok   Цитата(_Pasha @ May 29 2008, 07:47) Бился...   May 29 2008, 05:57
|- - _Pasha   Цитата(aesok @ May 29 2008, 08:57) Нужно ...   May 29 2008, 06:47
|- - aesok   Цитата(_Pasha @ May 29 2008, 10:47) Оптим...   May 29 2008, 07:03
- - _Pasha   Я всегда использую -Os, но здесь некоторый кусок к...   May 29 2008, 07:17
- - singlskv   Цитата(_Pasha @ May 29 2008, 07:47) Бился...   May 29 2008, 08:42
|- - _Pasha   Цитата(singlskv @ May 29 2008, 11:42) А п...   May 29 2008, 09:05
- - _Pasha   Какая же все-таки грабляндия эта арифметика! П...   Jun 1 2008, 09:27
|- - AHTOXA   Цитата(_Pasha @ Jun 1 2008, 15:27) Какая ...   Jun 1 2008, 14:04
|- - singlskv   Цитата(AHTOXA @ Jun 1 2008, 18:04) Ошибка...   Jun 1 2008, 14:22
|- - AHTOXA   Цитата(singlskv @ Jun 1 2008, 20:22) У Ва...   Jun 1 2008, 15:47
|- - _Pasha   Цитата(AHTOXA @ Jun 1 2008, 18:47) Но всё...   Jun 1 2008, 20:06
|- - AHTOXA   Цитата(_Pasha @ Jun 2 2008, 02:06) Про b=...   Jun 2 2008, 03:57
|- - _Pasha   Цитата(AHTOXA @ Jun 2 2008, 06:57) То ест...   Jun 2 2008, 05:19
|- - AHTOXA   Цитата(_Pasha @ Jun 2 2008, 11:19) Но про...   Jun 2 2008, 06:10
|- - _Pasha   Цитата(AHTOXA @ Jun 2 2008, 09:10) Нельзя...   Jun 2 2008, 06:30
|- - AHTOXA   Цитата(_Pasha @ Jun 2 2008, 12:30) Прочти...   Jun 2 2008, 07:54
|- - _Pasha   Цитата(AHTOXA @ Jun 2 2008, 10:54) Для че...   Jun 2 2008, 08:10
- - _Pasha   Это глюки не компилера, а отладчика, в котором Вы ...   Jun 3 2008, 18:49
- - AHTOXA   Цитата(_Pasha @ Jun 4 2008, 00:49) Это гл...   Jun 4 2008, 03:12
- - _Pasha   Цитата(_Pasha @ Jun 3 2008, 21:49) Бит SR...   Jun 4 2008, 05:55
- - AHTOXA   Цитата(_Pasha @ Jun 4 2008, 11:55) Короче...   Jun 4 2008, 07:53
- - AHTOXA   Я лопух:-) Цитата(AHTOXA @ Jun 4 2008, 13...   Jun 5 2008, 17:19


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

 


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


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