|
Как отключить оптимизацию switch() ? |
|
|
|
Jan 29 2012, 07:40
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Перепробовал все прагмы типа #pragma optimize=high/medium/low size/balanced/speed no_cse no_unroll no_tbaa no_inline no_code_motion Всё равно switch() оптимизирует и тратит из-за этого DPL,DPH & B в прерывании MCS-51. Мне надо чтобы switch из четырёх элементов сделался как через if () ... Ну неужели придётся делать ручками через if
Эскизы прикрепленных изображений
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 14)
|
Jan 29 2012, 08:03
|

Гуру
     
Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237

|
Цитата(GetSmart @ Jan 29 2012, 11:40)  Мне надо чтобы switch из четырёх элементов сделался как через if () ... Тогда и пишите 4 ифа вместо свича  . Во всех реализациях языков программирования (с которыми я встречалась) switch - это выбор из списка адресов, каковыми могут быть либо адреса безусловных переходов, либо адреса подпрограмм. Поэтому и реализация его такова, что где-то такой список составляется, а конкретные реализации различается между собой лишь способом вычисления смещения от начала списка с последующим переходом на этот адрес. Впервые слышу, чтобы switch оптимизировали путем замены на батарею if-ов. Если какие-то компиляторы на это способны, то хотелось бы услышать их названия.
|
|
|
|
|
Jan 29 2012, 10:15
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Нда. Переделал на if-ы. Стало на 11 байт короче самого оптимизированного варианта со свичём. Плюс в 2 раза меньше стека юзает 5 vs 10 байт. Оптимизаторы, рационализаторы  При этом в каждом if-е перечитывает переменную заново, хотя мог бы в акке держать и XOR-ить от варианта к варианту. IAR 7.60, оптимизация high/size. Ну а чего он читая битовую переменную (__bit || __bdata || sfr bit) анализирует её через флаг C, а не сразу в JB bit,label тоже вопрос к гениальным разработчикам.
Сообщение отредактировал GetSmart - Jan 29 2012, 11:48
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 29 2012, 11:55
|
;
     
Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509

|
Цитата(Xenia @ Jan 29 2012, 11:03)  Впервые слышу, чтобы switch оптимизировали путем замены на батарею if-ов. Если какие-то компиляторы на это способны, то хотелось бы услышать их названия. Я Вас умоляю... для MCS-51 команда CJNE <reg>, #immediate, offset как раз для этого случая. Может, кейл не понимайт, что выражение под свитчем не int, a char ? Цитата(GetSmart @ Jan 29 2012, 13:15)  Ну а чего он читая битовую переменную (__bit || __bdata || sfr bit) анализирует её через флаг C, а не сразу в JB bit,label тоже вопрос к гениальным разработчикам. Ну да, ну да  А выражение куда девать? И что там с lazy evaluation, если sfr bit у нас volatile? Я думаю, курить их хелп-не перекурить. Или избегать стрёмных ситуаций.
|
|
|
|
|
Jan 29 2012, 12:00
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(_Pasha @ Jan 29 2012, 16:55)  Может, кейл не понимайт, что выражение под свитчем не int, a char ? Какой Кейл? Подфорум об ИАРе. И не выражение, а переменная u08. Нету там promotion. Цитата(_Pasha @ Jan 29 2012, 16:55)  Ну да, ну да  А выражение куда девать? И что там с lazy evaluation, если sfr bit у нас volatile? Я думаю, курить их хелп-не перекурить. Или избегать стрёмных ситуаций. Вот и волатил и неволатил делает одинаково. (Upd. с неволатилом ещё не проверил, оказалось везде был волатил) lazy evaluation не знаю, куда притянуть. Я наткнулся на таких и подобных командах Код if (SCON0_bit.TI0) { SCON_bit.TI0 = 0; // хорошо хоть в этой команде не сдурил и сделал её битовой в одну команду // а был бы умным, поставил вообще jbc bit,label
Сообщение отредактировал GetSmart - Jan 29 2012, 16:41
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Jan 30 2012, 01:48
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(arttab @ Jan 30 2012, 06:09)  iar #pragma optimize=none Делает по-прежнему. Начинаю думать, что в 7.60 это единственный вариант кодирования свичей. Надо бы на 8-ой проверить. На картинке вторая часть того, во что ИАР превращает свич из 4-ёх вариантов. Тихий ужас. Цитата(Xenia @ Jan 30 2012, 01:21)  ...куда пускают только своих. Вы же его не видите потому, что вы не наш!  Ага. Кто не с нами, тот против нас. Так и запишем в протокол. А ведь до НГ я её видел. СОПУ испугались что ли.
Сообщение отредактировал GetSmart - Jan 30 2012, 05:01
Эскизы прикрепленных изображений
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|