Добро пожаловать на Pro Pawn - Портал о PAWN-скриптинге.
Страница 2 из 2 ПерваяПервая 1 2
Показано с 11 по 17 из 17
  1. #11
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от vovandolg Посмотреть сообщение
    зачем компилировать с JIT если JIT плагин не поддерживает корректно emit конструкции
    Директивами #emit занимается компилятор. Для JIT инструкции, сгенерированные из "традиционного" кода на Pawn и из #emit абсолютно одинаковы.

    Кстати про JIT...

    VVWVV, забыл сказать, что с предложенным мной подходом нельзя будет использовать JIT, т.к. с ним невозможна модификация кода во время выполнения. Максимум можно модифицировать код при вызове коллбэка OnJITCompile, непосредственно перед JIT-компиляцией.
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  2. #12
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Цитата Сообщение от Daniel_Cortez Посмотреть сообщение
    VVWVV, забыл сказать, что с предложенным мной подходом нельзя будет использовать JIT, т.к. с ним невозможна модификация кода во время выполнения. Максимум можно модифицировать код при вызове коллбэка OnJITCompile, непосредственно перед JIT-компиляцией.
    Да, JIT преподносит большое количество ограничений для emit. В таком случае я изменю первый пост, добавив в него твой подход, а также ссылку на подход Slice.

    Тем не менее, теперь появилось желание сделать все mem-функции в виде плагина (хотя возможно, что кто-то уже сделал это)

  3. #13
    Аватар для VVWVV
    ?

    Статус
    Оффлайн
    Регистрация
    09.07.2015
    Сообщений
    731
    Репутация:
    353 ±
    Обновлена функция под новый оператор __emit

    1. stock memset(array[], value, size=sizeof array)
    2. { //pro-pawn.ru/showthread.php?14919
    3. static fill_instruction_offset=0;
    4. emit {
    5. load.pri fill_instruction_offset
    6. jnz fill_array
    7. lctrl 6
    8. move.alt
    9. lctrl 0
    10. add
    11. move.alt
    12. lctrl 1
    13. sub.alt
    14. add.c (cellbits / charbits * 23)
    15. stor.pri fill_instruction_offset
    16. fill_array:
    17. load.s.pri size
    18. shl.c.pri 2
    19. sref.pri fill_instruction_offset
    20. load.s.pri value
    21. load.s.alt array
    22. fill 1
    23. }
    24. return 0;
    25. }

  4. #14
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Отпала ли несовместимость с JIT плагином в последней версии?

  5. #15
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Код с расчётом адреса инструкции fill можно было сделать немного эффективнее. В последних версиях компилятора (3.10.7 и 3.10.8) можно указать метку в качестве аргумента const.pri и add.c:
    1. lctrl 1
    2. move.alt
    3. lctrl 0
    4. sub
    5. add.c :fill_instr
    6. add.c (cellbits / charbits)

    К сожалению, компилятор не объединит две последние инструкции в одну: мне пришлось отключить оптимизатор для выражений с emit, ибо некоторые оптимизации работали некорректно, отключить их конкретно для кода внутри emit тоже нельзя - только для всего выражения.

    Для тех же случаев, когда аргументы value и size являются константами (а таких случаев подавляющее большинство), можно поступить намного проще:
    1. // memset(array, value)
    2. #define memset(%0,%1) \
    3.   emit(const.pri (%1), const.alt %0, fill (sizeof(%0) * (cellbits / charbits)))
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

  6. 2 пользователя(ей) сказали cпасибо:
    Outsider (16.08.2019) VVWVV (02.08.2018)
  7. #16
    Аватар для Salik_Davince
    Пользователь

    Статус
    Оффлайн
    Регистрация
    18.02.2014
    Сообщений
    93
    Репутация:
    1 ±
    Можете объяснить почему нету совместимости с JIT, в нем не работают какие-то инструкции? И какой вариант совместим с JIT ?

  8. #17
    Аватар для Daniel_Cortez
    "Это не хак, это фича"

    Статус
    Оффлайн
    Регистрация
    06.04.2013
    Адрес
    Novokuznetsk, Russia
    Сообщений
    2,192
    Репутация:
    2589 ±
    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    Можете объяснить почему нету совместимости с JIT, в нем не работают какие-то инструкции?
    Потому что функция модифицирует свой код (на самом деле всего 1 инструкцию) при каждом вызове - с JIT модификация кода не имеет эффекта.

    Цитата Сообщение от Salik_Davince Посмотреть сообщение
    И какой вариант совместим с JIT ?
    Предложенный мной выше вариант должен работать с JIT, но он подойдёт не во всех случаях (опять же, выше расписано, почему и как).
    Индивидуально в ЛС по скриптингу не помогаю. Задавайте все свои вопросы здесь (click).

 

 
Страница 2 из 2 ПерваяПервая 1 2

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •