|
gcc 4.2.2 и умножение int 16x16 |
|
|
|
May 29 2008, 03:47
|
;
     
Группа: Участник
Сообщений: 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 такт Бился головой о стену - ниасилил компилер такой красоты. А очень надо. Если кто уже получал такое чистым Си, поделитесь, пожалуйста, опытом.
|
|
|
|
|
 |
Ответов
|
Jun 1 2008, 09:27
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Какая же все-таки грабляндия эта арифметика! Привожу правильный и проверенный на всем множестве код для операции (int16_t) = (int16_t)*(uint8_t)/256 в виде AVR gnu-as Код #define arg1L r16 #define arg1H r17 #define scalar r18 #define NULL_REG r6 scale16x8: clr NULL_REG //........................... mul arg1L,scalar mov r2,r1 mulsu arg1H,scalar adc r0,r2 adc r1,NULL_REG
; result in r0:r1 Итого 7 тактов.
|
|
|
|
|
Jun 1 2008, 14:04
|

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

|
Цитата(_Pasha @ Jun 1 2008, 15:27)  Какая же все-таки грабляндия эта арифметика! Привожу правильный и проверенный на всем множестве код для операции Переписал для inline асссемблера: Код static inline uint16_t scale16x8(uint16_t a, uint8_t b) { uint16_t result; uint8_t tmp; /* %A0 - low byte of result, %B0 - hi byte of result, %1 - tmp %A2 - low byte of the first operand, %B2 - hi byte of the first operand, %3 - second operand */
asm ( "clr %1 \n\t" "mul %A2,%3 \n\t" "mov r2,r1 \n\t" "mulsu %B2,%3 \n\t" "adc r0,r2 \n\t" "adc r1,%1 \n\t" "movw %A0, r0 \n\t" "clr __zero_reg__ \n\t" : "=&r" (result), "=&r" (tmp) : "a" (a), "a" (b) );
return result; } Добавил зачистку __zero_reg__, так положено. Только вот что-то не сходится: Код int scale_test(void) { uint16_t a = 0; uint8_t b = 0; while (TRUE) { if (scale16x8(a, b) != ((unsigned long)a*b/256)) { nokia_puts_p("a = "); nokia_put_word(a); nokia_puts_p(", b = "); nokia_put_word(b); return FALSE; } if (a == 0xFFFF && b == 0xFF) return TRUE; if (!++b) a++; } } Ошибка при a=0x8000 и b=1.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 1 2008, 14:22
|
дятел
    
Группа: Свой
Сообщений: 1 681
Регистрация: 13-05-06
Из: Питер
Пользователь №: 17 065

|
Цитата(AHTOXA @ Jun 1 2008, 18:04)  Ошибка при a=0x8000 и b=1. У Вас static inline uint16_t scale16x8( uint16_t a , uint8_t b ) а было: (int16_t) = ( int16_t )*(uint8_t)/256
|
|
|
|
Сообщений в этой теме
_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   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 AHTOXA Я добрался до АВРки, продолжаю
Урезал осетра, зап... Jun 3 2008, 17:20 aesok Цитата(AHTOXA @ Jun 3 2008, 21:20) Интере... Jun 3 2008, 18:57 _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
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|