Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.09.2016, 14:55   #1
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию Assembler + inline

Заметил, что Berlin не позволяет объявлять функции, содержащие ассемблерные вставки, как inline. Это всегда так было (с Delphi 2005) или появилось позже (и когда)? Можно ли это как-то обойти?

p.s. И еще вопрос: правильно ли я понимаю, что intrinsic-функции — это по сути и есть inline-функции или между ними есть какая-то разница? Я не говорю про сравнение ассемблерных вставок и кода на чистом ЯВУ (потому что в Яндексе при вроде запроса о разнице между intrinsic и inline-функциями приводится именно сравнение intrinsic на чистом ЯВУ и inline на ассемблере). Я спрашиваю про разницу между intrinsic и inline при прочих равных (и то, и то на ЯВУ или и то, и другое на асме).
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 15:27   #2
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

По моему это всю жизнь так было. Правда не уверен.

Разницы нет. Разве что inline-функция не обязана заинлайниться, а intrinsic при любом раскладе.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.09.2016, 15:30   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Заметил, что Berlin не позволяет объявлять функции, содержащие ассемблерные вставки, как inline. Это всегда так было (с Delphi 2005) или появилось позже (и когда)? Можно ли это как-то обойти?
это логично, их не факт что можно переадаптировать на инлайн.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 15:37   #4
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Заметил, что Berlin не позволяет объявлять функции, содержащие ассемблерные вставки, как inline. Это всегда так было (с Delphi 2005) или появилось позже (и когда)? Можно ли это как-то обойти?
где-то с XE версии функцию нельзя частично написать на BASM, а потому ф-ю, написанную на BASM нельзя сделать inline. Нет, нельзя это обойти.
Человек_Борща вне форума Ответить с цитированием
Старый 28.09.2016, 15:39   #5
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Нет, нельзя это обойти.
Свой генератор кода или прероцессор.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 28.09.2016, 16:22   #6
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
это логично, их не факт что можно переадаптировать на инлайн.
Чего ж тут логичного?
Записал параметры в регистры (и в стек, если надо) и так же используй, какие проблемы? Только без call и ret.

А почему inline-функция может не заинлайниться?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 16:25   #7
7in
(aka Jin X) !RTFM!
Форумчанин
 
Аватар для 7in
 
Регистрация: 14.12.2014
Сообщений: 295
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
где-то с XE версии функцию нельзя частично написать на BASM, а потому ф-ю, написанную на BASM нельзя сделать inline. Нет, нельзя это обойти.
Почему BASM?
Хотите сказать, нельзя делать ассемблерные вставки в функции? Хм, надо попробовать.
Разве это не для iOS только?
Делаю лабы на Asm/Delphi/C++/Python/VBA(Excel): asmlabs.ru
7in вне форума Ответить с цитированием
Старый 28.09.2016, 16:30   #8
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

Цитата:
Почему BASM?
Borland ASM.
Цитата:
Чего ж тут логичного?
Записал параметры в регистры (и в стек, если надо) и так же используй, какие проблемы? Только без call и ret.

А почему inline-функция может не заинлайниться?
потому что состояние стека/регистров своего фрейма вы полностью можете контролировать, а состояние стека/регистров фрейма может отличаться от того что ожидает код на асм.
адаптировать то паскаль-код легко, а вот асм-код уже нет.
если при инлайне обычного кода это все легко пересчитывается, то при инлайне асм кода пересчет может стать слишком большим.

потому что компилятор может посчитать что нет смысла в этом, ибо слишком разбухнет код.
заинлайнить все и вся, конечно быстрее, но вот размер кода резко
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 28.09.2016, 16:49   #9
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Цитата:
Почему BASM?
Это не полноценный ассемблер, просто Build in Assembler ну или Borland Assembler, суть не меняется.

Цитата:
Свой генератор кода или прероцессор.
Удачи в написании delphi-совместимого сабжа.

Цитата:
потому что состояние стека/регистров своего фрейма вы полностью можете контролировать, а состояние стека/регистров фрейма может отличаться от того что ожидает код на асм.
Именно. Паскаль-код поддается оптимизации и переработке в процессе обработки исходника. Раньше это работало, потому что компилятор напрочь игнорировал метод, если в нем есть вставка ассемблера, и компилировал "как есть", теперь же будьте добры, вынести ассемблер в полноценный метод, и вызывать его, просто отделили котлеты от мух (что все, кто писал на BASM и так делали, потому как делать в паскаль-коде mov eax, ebx и продолжать писать на паскале - ну совсем неудобно), и правильно сделали.

Последний раз редактировалось Человек_Борща; 28.09.2016 в 16:52.
Человек_Борща вне форума Ответить с цитированием
Старый 28.09.2016, 18:12   #10
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Удачи в написании delphi-совместимого сабжа.
Спасибо. Но я имел ввиду не гегерацию бинарного кода, а текста на языке паскаль. Это не трудно.

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Именно. Паскаль-код поддается оптимизации и переработке в процессе обработки исходника. Раньше это работало, потому что компилятор напрочь игнорировал метод, если в нем есть вставка ассемблера, и компилировал "как есть", теперь же будьте добры, вынести ассемблер в полноценный метод, и вызывать его, просто отделили котлеты от мух (что все, кто писал на BASM и так делали, потому как делать в паскаль-коде mov eax, ebx и продолжать писать на паскале - ну совсем неудобно), и правильно сделали.
Ошибаетесь. Вначале код переводится в IR-ассемблер, а позже оптимизируется. Никакого повода к запрету смешивать код на BASM и паскале нету. Кроме понятия качества кода. Такой код проще тестировать и анализировать недопарсерами. После кто-то протащил это в стандарт Си++. И ембаркодеры когда прикручивали LLIM вынуждены были поддержать данную изюминку.
Но в ней нет ни какой надобности. Всё равно все делают инстриксы которые напрямую переводятся в IR. По сути это одна и тажа работа. Разве что инстриксов меньше чем асм-команд.

А поповоду не заинлайнится. Так это от оптимизатора зависит. Это опять из стандарта Си++. Типо если с функцией код быстрее чем инлайн, а такое бывает - то оптимизатор может неинлайнить.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
inline c gcc O3 медленее чем без inline LynXzp Общие вопросы C/C++ 4 27.12.2012 20:54
Inline assembler C++ функция swap(). nartov55 Помощь студентам 7 04.04.2012 14:28
inline assembler qt lem Qt и кроссплатформенное программирование С/С++ 5 15.08.2011 12:08
gcc inline assembler - обнуление переменной gvf Помощь студентам 1 13.06.2010 19:33
inline??? пыхта4ог Общие вопросы C/C++ 2 09.11.2007 17:54