#26 2018-07-01 21:53:08

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

Я попусту стараюсь никогда не болтать. К сожалению подсветка ассемблера не предусмотрена. Это AVR GCC.

/*
 ============================================================================
 Name        : case-test.c
 Author      : slavaza
 Version     : 0.0
 Copyright   : Vyacheslav Azarov
 Description : proof
 ============================================================================
 */

#define __AVR_ATmega328__

#include <stdio.h>
#include <stdlib.h>
#include <avr/io.h>

int result = 0;

int main(void) {

	int input = PORTB;

	switch (input)
	{
		case 1: result = 23; break;
		case 2: result = 22; break;
		case 3: result = 21; break;
		case 4: result = 20; break;
		case 5: result = 19; break;
		case 6: result = 18; break;
		case 7: result = 17; break;
		case 8: result = 16; break;
		case 9: result = 15; break;
		case 10: result = 14; break;
		case 11: result = 13; break;
		case 12: result = 12; break;
		case 13: result = 11; break;
		case 14: result = 9; break;
		case 15: result = 8; break;
		case 16: result = 7; break;
		case 17: result = 6; break;
		case 18: result = 5; break;
		case 19: result = 4; break;
		case 125: result = 3; break;
		case 215: result = 2; break;
		case 69: result = 1; break;
		default: result = 0;
	}

	return result;
}
	.file	"case-test.c"
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__SREG__ = 0x3f
__tmp_reg__ = 0
__zero_reg__ = 1
	.text
.Ltext0:
	.cfi_sections	.debug_frame
	.section	.text.startup,"ax",@progbits
.global	main
	.type	main, @function
main:
.LFB5:
	.file 1 "../src/case-test.c"
	.loc 1 19 0
	.cfi_startproc
/* prologue: function */
/* frame size = 0 */
/* stack size = 0 */
.L__stack_usage = 0
	.loc 1 21 0
	in r30,0x5
.LVL0:
	.loc 1 23 0
	mov r24,r30
	ldi r25,0
	mov r30,r24
	mov r31,r25
.LVL1:
	sbiw r30,1
	cpi r30,-41
	cpc r31,__zero_reg__
	brlo .L28
.L2:
	.loc 1 47 0
	sts result+1,__zero_reg__
	sts result,__zero_reg__
	lds r24,result
	lds r25,result+1
.LVL2:
	.loc 1 51 0
	ret
.LVL3:
.L28:
	.loc 1 23 0
	subi r30,lo8(-(gs(.L4)))
	sbci r31,hi8(-(gs(.L4)))
	ijmp
	.section	.progmem.gcc_sw_table,"ax",@progbits
	.p2align	1
.L4:
	rjmp .L3
	rjmp .L5
	rjmp .L6
	rjmp .L7
	rjmp .L8
	rjmp .L9
	rjmp .L10
	rjmp .L11
	rjmp .L12
	rjmp .L13
	rjmp .L14
	rjmp .L15
	rjmp .L16
	rjmp .L17
	rjmp .L18
	rjmp .L19
	rjmp .L20
	rjmp .L21
	rjmp .L22
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L23
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L24
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L2
	rjmp .L25
	.section	.text.startup
.L25:
	.loc 1 45 0
	ldi r24,lo8(2)
	ldi r25,0
.LVL4:
	sts result+1,r25
	sts result,r24
	ret
.LVL5:
.L24:
	.loc 1 44 0
	ldi r24,lo8(3)
	ldi r25,0
.LVL6:
	sts result+1,r25
	sts result,r24
	ret
.LVL7:
.L23:
	.loc 1 46 0
	ldi r24,lo8(1)
	ldi r25,0
.LVL8:
	sts result+1,r25
	sts result,r24
	ret
.LVL9:
.L22:
	.loc 1 43 0
	ldi r24,lo8(4)
	ldi r25,0
.LVL10:
	sts result+1,r25
	sts result,r24
	ret
.LVL11:
.L21:
	.loc 1 42 0
	ldi r24,lo8(5)
	ldi r25,0
.LVL12:
	sts result+1,r25
	sts result,r24
	ret
.LVL13:
.L20:
	.loc 1 41 0
	ldi r24,lo8(6)
	ldi r25,0
.LVL14:
	sts result+1,r25
	sts result,r24
	ret
.LVL15:
.L19:
	.loc 1 40 0
	ldi r24,lo8(7)
	ldi r25,0
.LVL16:
	sts result+1,r25
	sts result,r24
	ret
.LVL17:
.L18:
	.loc 1 39 0
	ldi r24,lo8(8)
	ldi r25,0
.LVL18:
	sts result+1,r25
	sts result,r24
	ret
.LVL19:
.L17:
	.loc 1 38 0
	ldi r24,lo8(9)
	ldi r25,0
.LVL20:
	sts result+1,r25
	sts result,r24
	ret
.LVL21:
.L16:
	.loc 1 37 0
	ldi r24,lo8(11)
	ldi r25,0
.LVL22:
	sts result+1,r25
	sts result,r24
	ret
.LVL23:
.L15:
	.loc 1 36 0
	ldi r24,lo8(12)
	ldi r25,0
.LVL24:
	sts result+1,r25
	sts result,r24
	ret
.LVL25:
.L14:
	.loc 1 35 0
	ldi r24,lo8(13)
	ldi r25,0
.LVL26:
	sts result+1,r25
	sts result,r24
	ret
.LVL27:
.L13:
	.loc 1 34 0
	ldi r24,lo8(14)
	ldi r25,0
.LVL28:
	sts result+1,r25
	sts result,r24
	ret
.LVL29:
.L12:
	.loc 1 33 0
	ldi r24,lo8(15)
	ldi r25,0
.LVL30:
	sts result+1,r25
	sts result,r24
	ret
.LVL31:
.L11:
	.loc 1 32 0
	ldi r24,lo8(16)
	ldi r25,0
.LVL32:
	sts result+1,r25
	sts result,r24
	ret
.LVL33:
.L10:
	.loc 1 31 0
	ldi r24,lo8(17)
	ldi r25,0
.LVL34:
	sts result+1,r25
	sts result,r24
	ret
.LVL35:
.L9:
	.loc 1 30 0
	ldi r24,lo8(18)
	ldi r25,0
.LVL36:
	sts result+1,r25
	sts result,r24
	ret
.LVL37:
.L8:
	.loc 1 29 0
	ldi r24,lo8(19)
	ldi r25,0
.LVL38:
	sts result+1,r25
	sts result,r24
	ret
.LVL39:
.L7:
	.loc 1 28 0
	ldi r24,lo8(20)
	ldi r25,0
.LVL40:
	sts result+1,r25
	sts result,r24
	ret
.LVL41:
.L6:
	.loc 1 27 0
	ldi r24,lo8(21)
	ldi r25,0
.LVL42:
	sts result+1,r25
	sts result,r24
	ret
.LVL43:
.L5:
	.loc 1 26 0
	ldi r24,lo8(22)
	ldi r25,0
.LVL44:
	sts result+1,r25
	sts result,r24
	ret
.LVL45:
.L3:
	.loc 1 25 0
	ldi r24,lo8(23)
	ldi r25,0
.LVL46:
	sts result+1,r25
	sts result,r24
	ret
	.cfi_endproc
.LFE5:
	.size	main, .-main
.global	result
	.section .bss
	.type	result, @object
	.size	result, 2
result:
	.zero	2

Остання редакція Вячеслав Азаров (2018-07-01 22:51:26)

Неактивний

#27 2018-07-01 22:09:17

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

Хочу сказать, что GCC хоть и прогрессивный но далеко не самый лучший компилятор. Хотя все зависит от бекенда архитектуры. В других компиляторах, например AVCASE51, создается несколько таблиц для поддиапазонов значений.

Неактивний

#28 2018-07-01 22:32:13

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

Re: Макроопределения для портов.

Вячеслав Азаров, проверил Ваш пример, так получается с -O2, попробуйте -Os, получается опять дерево. Или в case значение более 255 тоже дерево. (Ну т.е. что не противоречит ничему вышесказанному, но просто сравнил)

Batu пише:

А для примера было бы достаточно и 3-х Case.

Бинарное дерево для трех элементов? О да, это даст большой прирост в производительности. Но таки да, для трех проверок он их сделает последовательно, браво, таки есть и третий случай, когда как не делай разницы почти никакой! С четырех уже делает дерево.

Batu пише:

Такое решение все равно жопа для решения предложенной задачи.

И я что-то не заметил чтобы автор темы просил выиграть два такта процессора, или вообще что-то говорил о производительности. И если автор темы сделает switch в макросе или инлайн функции то он может стать быстрее другого решения в не инлайн функции.

Batu пише:

Меня не переубедил.

Это не я, это суровая реальность переубеждает, я лишь показываю ее Вам, и всем читающим.

Неактивний

#29 2018-07-01 22:47:21

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

LynX пише:

Вячеслав Азаров, проверил Ваш пример, так получается с -O2, попробуйте -Os, получается опять дерево. Или в case значение более 255 тоже дерево. (Ну т.е. что не противоречит ничему вышесказанному, но просто сравнил) ...

Да это не двоичный поиск по дереву, просто несортированый список сравнений. Я даже незнаю, делает ли такое AVR GCC.

Неактивний

#30 2018-07-01 22:50:00

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

LynX пише:
Batu пише:

Меня не переубедил.

Это не я, это суровая реальность переубеждает, я лишь показываю ее Вам, и всем читающим.

Понятие красоты у каждого свое.. Видимо я очень жадный и по памяти и по производительности. Я б не использовал Switch для данной задачи на этом процессоре.

Неактивний

#31 2018-07-01 23:15:53

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

Re: Макроопределения для портов.

Вячеслав Азаров пише:
LynX пише:

Вячеслав Азаров, проверил Ваш пример, так получается с -O2, попробуйте -Os, получается опять дерево. Или в case значение более 255 тоже дерево. (Ну т.е. что не противоречит ничему вышесказанному, но просто сравнил) ...

Да это не двоичный поиск по дереву, просто несортированый список сравнений. Я даже незнаю, делает ли такое AVR GCC.

Не совсем понял. Что-то не хочется по каждому переходу разбирать, но в начале переходы идут на большие блоки, а с больших на блоки поменьше. В конце из одиночных все прыгает в точку возврата. По крайней мере так и должно выглядеть бинарное дерево. Что такое "несортированый список сравнений" не понял.

Ну и бинарное дерево это не что-то архисложное. Чего бы ему такого не уметь. GCC конечно не №1, AVR GCC может и отставать от родителя, но это более чем адекватный компилятор.

P.S. В clang llvm сделали разбиение на бекэенд и фронтенд компиляцию, т.е. это должно позволить компилировать много языков с максимально возможной оптимизацией и на много платформ. Несколько языков завезли, оптимизацию завозят фурами, а на платформах типа avr только провели эксперимент.

Неактивний

#32 2018-07-01 23:33:08

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

LynX пише:

... оптимизацию завозят фурами, а на платформах типа avr только провели эксперимент.

Автоматическая оптимизация программ - архисложная задача, которая далеко не каждому по зубам. GCC это не эксперимент, а инструментальный компилятор американской промышленности, как и POSIX, который занесен в реестр национального интелектуального достояния США. Нам, просто, дают поиграть, публичными версиями. Хотите лучше, тогда смотрите на IAR.

Неактивний

#33 2018-07-01 23:57:16

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

Re: Макроопределения для портов.

GCC open source, это даже в названии отражено, Столман главный ... маскот. Я не знаком с процессом разработки gcc, но очень сильно сомневаюсь что он не публичный.

В реестр национального интелектуального достояния? Круто! Но в эти реестры заносят по уровню значимости в истории и ровным счетом ничего не говорит.


А про бекэнд llvm для avr, это я так, к слову сказал, просто зашел на гитхаб, а там ни одного коммита за последний год, вот сейчас глянул точнее - его слили в главный llvm и потихоньку пилят. Преимущество в том что его можно особо и не пилить. Любая оптимизация добавляемая в llvm скажем для компиляции в MacOS, и любой язык, будет работать и на благо всего семейства, включая AVR, так что он улучшается даже ничего не делая в AVR части, готовность ее состояния не знаю, но там тоже потихоньку процесс идет.

IAR нет потому что есть open source решения, которые поддерживают большее количетво платформ. И... скажем между первыми 10 топовыми компиляторами, разница ... почти нулевая. Даже сравнивать не надо, все по закону кого-то там (достижение идеала по экспоненциальной сложности).

Остання редакція LynX (2018-07-02 00:06:47)

Неактивний

#34 2018-07-02 07:14:09

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

По-моему первый пост куда решил встрять. Все в традициях соц. сетей. Каждый слышит сам себя и спорит с оппонентом когда и смысл спора пропал. А то, что я хотел сказать так никто и не понял. Жаль. Есть минимум 3 способа увеличить производительность, уменьшить память и все это без потери читабельности. Рассказать некому.. Хотя вроде собеседники вполне соображающие. Парадокс.

Неактивний

#35 2018-07-02 11:50:06

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

LynX пише:

GCC open source, это даже в названии отражено, Столман главный ... маскот. Я не знаком с процессом разработки gcc, но очень сильно сомневаюсь что он не публичный...

Почему не публичный? Публичный. Вот одно из зеркал: https://github.com/gcc-mirror/gcc Можете попробовать внести свои улучшения сделав запрос к оветственным разработчикам или создать свою собственную ветвь GCC, как сделали Google, Atmel или STMicroelecronics с Ac6. Или связаться с авторами и участниками https://gcc.gnu.org/onlinedocs/gcc/Contributors.html. А правовые аспекты я обсуждать не хочу.

Неактивний

#36 2018-07-02 12:03:55

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

Вячеслав Азаров пише:
LynX пише:

... оптимизацию завозят фурами, а на платформах типа avr только провели эксперимент.

Автоматическая оптимизация программ - архисложная задача, которая далеко не каждому по зубам.

Принципы оптимизации разработаны в 60-х годах. Там нет ничего военного и с тех пор ничего не поменялось по существу. Тоже самое могу сказать за архитектуру процессора. Мелочи типа конвейерной и скалярной обработки, кэш ничего принципиально не меняют. Мне смешно читать за эту "сложность".

Неактивний

#37 2018-07-02 12:06:45

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

Вячеслав Азаров пише:
LynX пише:

GCC open source, это даже в названии отражено, Столман главный ... маскот. Я не знаком с процессом разработки gcc, но очень сильно сомневаюсь что он не публичный...

Почему не публичный? Публичный. Вот одно из зеркал: https://github.com/gcc-mirror/gcc Можете попробовать внести свои улучшения сделав запрос к оветственным разработчикам или создать свою собственную ветвь GCC, как сделали Google, Atmel или STMicroelecronics с Ac6. Или связаться с авторами и участниками https://gcc.gnu.org/onlinedocs/gcc/Contributors.html. А правовые аспекты я обсуждать не хочу.

Менять надо сам подход к архитектуре процессора. Тогда появятся новые возможности. Скрести по сусекам нет никакого смысла. Работы море, а результат того не стоит.

Неактивний

#38 2018-07-02 12:18:39

Вячеслав Азаров
Учасник
Зареєстрований: 2017-05-25
Повідомлень: 1,732

Re: Макроопределения для портов.

Batu пише:
Вячеслав Азаров пише:
LynX пише:

... оптимизацию завозят фурами, а на платформах типа avr только провели эксперимент.

Автоматическая оптимизация программ - архисложная задача, которая далеко не каждому по зубам.

Принципы оптимизации разработаны в 60-х годах. Там нет ничего военного и с тех пор ничего не поменялось по существу. Тоже самое могу сказать за архитектуру процессора. Мелочи типа конвейерной и скалярной обработки, кэш ничего принципиально не меняют. Мне смешно читать за эту "сложность".

Смеётся тот кто смеётся последним! (Жан Пьер Флориан (1755— 1794))

Неактивний

#39 2018-07-02 12:38:32

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

Вячеслав Азаров пише:

Смеётся тот кто смеётся последним! (Жан Пьер Флориан (1755— 1794))

Я уже начал. Ибо заниматься оптимизацией ты не будешь.. Даже ждать не стоит

Неактивний

#40 2018-07-02 12:44:10

LynX
Учасник
Зареєстрований: 2018-04-19
Повідомлень: 71

Re: Макроопределения для портов.

Batu пише:

Я уже начал. Ибо заниматься оптимизацией ты не будешь.. Даже ждать не стоит

google.com/search?q=преждевременная+оптимизация

Неактивний

#41 2018-07-02 13:08:30

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

LynX пише:
Batu пише:

Я уже начал. Ибо заниматься оптимизацией ты не будешь.. Даже ждать не стоит

google.com/search?q=преждевременная+оптимизация

Ты перепутал термины. Это ошибка в постановке задачи. Так что нет смысла решать.

Неактивний

#42 2018-07-02 13:39:41

Batu
Учасник
З Харьков
Зареєстрований: 2017-11-08
Повідомлень: 301

Re: Макроопределения для портов.

Кстати, за оптимизацию данной задачи. Можно организовать переходы вообще без команд сравнения.

Неактивний

Швидке повідомлення

Введіть повідомлення і натисніть Надіслати

Підвал форуму