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

 
 
> avr-libc и uint64_t арифметика, или баг, или я чего-то не понимаю...
ARV
сообщение Sep 28 2009, 16:46
Сообщение #1


Профессионал
*****

Группа: Свой
Сообщений: 1 143
Регистрация: 30-09-08
Из: Новочеркасск
Пользователь №: 40 581



Код
volatile uint64_t v1;
volatile uint32_t v2;

int main(void)
{
    v2 = v1/v2;
    PORTD = 12;
    while(1);
}
этот тривиальный код компилируется для attiny2313 в 3940 байтов flash и 278 байт ОЗУ!!!! это как такое называется?! при этом если обе переменные v1 и v2 сделать uint32_t, то размер кода становится практически в 20 раз меньше: 200 байт flash !!! что там такое в libc понаделано, что получается такое разрастание кода?! ведь если руками написать функцию деления "в столбик" - получится код значительно меньше...

P.S. разумеется, оптимизация -Os


--------------------
Я бы взял частями... но мне надо сразу.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_Pasha
сообщение Sep 29 2009, 04:39
Сообщение #2


;
******

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



учитывая то, что мне часто нужны быстрые умножения 16*16=32, перестал морочить голову, завел файл с асмовыми вставками. Теперь там будут и для 64 битных. Тут уже по две версии - регистровая и через указатели.
Go to the top of the page
 
+Quote Post
klen
сообщение Oct 1 2009, 18:00
Сообщение #3


бессмертным стать можно тремя способами
*****

Группа: Свой
Сообщений: 1 405
Регистрация: 9-05-06
Из: Москва
Пользователь №: 16 912



скомпилял этот пример

вот что получилось для -Os -mmcu=atmega64
Цитата
.file "int64.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
.text
.global main
.type main, @function
main:
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
push r16
push r17
/* prologue: function */
/* frame size = 0 */
lds r18,v1
lds r19,v1+1
lds r20,v1+2
lds r21,v1+3
lds r22,v1+4
lds r23,v1+5
lds r24,v1+6
lds r25,v1+7
lds r2,v2
lds r3,(v2)+1
lds r4,(v2)+2
lds r5,(v2)+3
movw r10,r2
movw r12,r4
clr r14
clr r15
ldi r16,lo8(0)
ldi r17,lo8(0)
call __udivdi3
movw r24,r18
movw r26,r20
sts v2,r24
sts (v2)+1,r25
sts (v2)+2,r26
sts (v2)+3,r27
ldi r24,lo8(12)
out 50-0x20,r24
.L2:
rjmp .L2
.size main, .-main
.comm v1,8,1
.comm v2,4,1


для -Os -mmcu=attiny2313
Цитата
.file "int64.c"
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
.text
.global main
.type main, @function
main:
push r2
push r3
push r4
push r5
push r6
push r7
push r8
push r9
push r10
push r11
push r12
push r13
push r14
push r15
push r16
push r17
/* prologue: function */
/* frame size = 0 */
lds r18,v1
lds r19,v1+1
lds r20,v1+2
lds r21,v1+3
lds r22,v1+4
lds r23,v1+5
lds r24,v1+6
lds r25,v1+7
lds r2,v2
lds r3,(v2)+1
lds r4,(v2)+2
lds r5,(v2)+3
movw r10,r2
movw r12,r4
clr r14
clr r15
ldi r16,lo8(0)
ldi r17,lo8(0)
rcall __udivdi3
movw r24,r18
movw r26,r20
sts v2,r24
sts (v2)+1,r25
sts (v2)+2,r26
sts (v2)+3,r27
ldi r24,lo8(12)
out 50-0x20,r24
.L2:
rjmp .L2
.size main, .-main
.comm v1,8,1
.comm v2,4,1


я не заметил криминала по размеру, на счет правильности нада конечно проверить но.. я изредко интами 64 пользуюсь - вроде работало.

теперь нада лесть в __udivdi3

avr-libc как я понимаю вообще нипричем. операции над стандартными целыми типами - исключительно компиллер в libgcc реализует

тут какято поППа - 3312 инструкций... нада поглядеть исходнички!
посмотрел...

в исходничке libgcc2.c есть реализация на асме операции деления 32/32 , как мне кажется можно по образу и подобию изготовить 64/64

если найдется доброволец взятся за эту учебную задачку высеч сей гранитный монумент я поробую всунуть его под основание фундамента avr GCC, Анатолий Соколов польет это сверху цементом используя комит в транк эсвэна.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- ARV   avr-libc и uint64_t арифметика   Sep 28 2009, 16:46
- - Lepeksiy   Ну дык никто не мешает посмотреть получившийся код...   Sep 28 2009, 18:13
- - ARV   я не вижу смысла смотреть в получающийся код - и т...   Sep 28 2009, 18:48
- - Goodefine   Цитата(Lepeksiy @ Sep 28 2009, 21:13) ......   Sep 28 2009, 19:08
|- - GetSmart   Цитата(Goodefine @ Sep 29 2009, 01:08) А ...   Sep 28 2009, 19:27
|- - ReAl   Цитата(GetSmart @ Sep 28 2009, 22:27) ИМХ...   Sep 28 2009, 21:59
- - IgorKossak   ARV, Вы полагаете, что разработчики где-то здесь, ...   Sep 28 2009, 19:13
|- - ARV   Цитата(IgorKossak @ Sep 28 2009, 23:13) A...   Sep 29 2009, 04:31
- - ReAl   Там таки явно что-то не то. Зачем-то большая табли...   Sep 28 2009, 20:52
|- - singlskv   Цитата(ReAl @ Sep 29 2009, 00:52) upd: ой...   Sep 28 2009, 22:53
|- - ReAl   Цитата(klen @ Oct 1 2009, 21:00) если най...   Oct 2 2009, 13:42
|- - _Pasha   Цитата(ReAl @ Oct 2 2009, 16:42) Можно да...   Oct 2 2009, 16:19
|- - klen   Цитата(_Pasha @ Oct 2 2009, 20:19) Поскол...   Oct 2 2009, 18:25
|- - Petka   Цитата(klen @ Oct 2 2009, 22:25) .... за...   Oct 2 2009, 19:01
|- - singlskv   Цитата(Petka @ Oct 2 2009, 23:01) т.е. та...   Oct 2 2009, 21:46
- - ReAl   Цитата(singlskv @ Oct 3 2009, 00:46) ИМХО...   Oct 2 2009, 22:15
- - Княго   Интересно, зачем вам на авээрах делить 64-битные ч...   Oct 4 2009, 19:19


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

 


RSS Текстовая версия Сейчас: 24th July 2025 - 01:15
Рейтинг@Mail.ru


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