User Tag List

Страница 5 из 13 ПерваяПервая 123456789 ... ПоследняяПоследняя
Показано с 41 по 50 из 125

Тема: LLVM Backend для Z80

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1

    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    В последнее время занимался продумыванием и переписыванием .td файлов, в которых описываются все инструкции и регистры процессора Z80. Это позволяет многие упрощения (lowering) реализовать автоматически, т.е. преобразовывать команды llvm в команды процессора Z80 лишь путем описания в .td файлах, что очень удобно и упрощает разработку. Однако не для всех инструкций Z80 есть аналоги в llvm и наоборот не все llvm команды могут быть нативно выполнены на Z80. Для вторых создаются функции, которые заменяют llvm инструкцию на цепочку команд Z80. С первыми бывает немного сложнее, особенно если хочется их использовать для генерации более компактного кода. Поэтому оптимизацией никакой на данном этапе я не занимаюсь. Сейчас просто покажу пару примеров того, что уже может быть скомпилировано.

    Пример №1:
    Код:
    unsigned char test(bool useFirst, unsigned char first, unsigned char second)
    {
    	return (useFirst) ? first : second;
    }
    После генерации llvm кода clang'ом:
    Код:
    ; ModuleID = 'test.cpp'
    target datalayout = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-n8:16"
    target triple = "z80"
    
    define i8 @_Z4testbhh(i1 %useFirst, i8 %first, i8 %second) nounwind readnone {
    entry:
      %cond = select i1 %useFirst, i8 %first, i8 %second
      ret i8 %cond
    }
    После генерации кода Z80 утилитой llc (аргументы передаются в регистрах A, B, C по порядку):
    Код:
    	.file	"test.ll"
    	.text
    	.globl	_Z4testbhh
    	.type	_Z4testbhh,@function
    _Z4testbhh:                             ; @_Z4testbhh
    ; BB#0:                                 ; %entry
    	and	1
    	cp	0
    	jp	nz, .BB0_2
    ; BB#1:                                 ; %entry
    	ld	b, c
    .BB0_2:                                 ; %entry
    	ld	a, b
    	ret
    .tmp0:
    	.size	_Z4testbhh, .tmp0-_Z4testbhh
    Пример №2:
    Код:
    unsigned char test(unsigned char a, unsigned char b)
    {
    	return (b^0xFF) + (a&0x0F);
    }
    После генерации llvm кода clang'ом:
    Код:
    ; ModuleID = 'test.cpp'
    target datalayout = "e-p:16:8:8-i8:8:8-i16:8:8-i32:8:8-n8:16"
    target triple = "z80"
    
    define i8 @_Z4testhh(i8 %a, i8 %b) nounwind readnone {
    entry:
      %xor = xor i8 %b, -1
      %and = and i8 %a, 15
      %add = add i8 %and, %xor
      ret i8 %add
    }
    После генерации кода Z80 утилитой llc (аргументы передаются в регистрах A, B по порядку):
    Код:
    	.file	"test.ll"
    	.text
    	.globl	_Z4testhh
    	.type	_Z4testhh,@function
    _Z4testhh:                              ; @_Z4testhh
    ; BB#0:                                 ; %entry
    	and	15
    	ld	c, a
    	ld	a, b
    	cpl
    	ld	b, a
    	ld	a, c
    	add	a, b
    	ret
    .tmp0:
    	.size	_Z4testhh, .tmp0-_Z4testhh
    В данный момент осталось дописать команды условных и прямых переходов. Замечу, что на данный момент везде используются переходы JP, что также связано отказом от оптимизации на данный момент. В дальнейшем добавлю проход для генерации JR переходов.
    Ну и самый пока неоднозначный для меня момент это работа с памятью через регистры. Очень не хочется все упрощения делать вручную, да и не обязательно это, но как это лучше реализовать в .td файлах пока думаю.

    На этом пока все. Если у кого-то есть какие-то вопросы или пожелания, говорите.
    Последний раз редактировалось EARL; 31.10.2012 в 23:44.

  2. #1
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #2

    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    236
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    20 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Однако не для всех инструкций Z80 есть аналоги в llvm и наоборот не все llvm команды могут быть нативно выполнены на Z80. Для вторых создаются функции, которые заменяют llvm инструкцию на цепочку команд Z80
    Про rtlib в курсе, кстати? http://llvm.org/docs/doxygen/html/na..._1_1RTLIB.html

  4. #3

    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    mastermind, нет, не в курсе. Если разбирался с этим, то думаю стоить обменяться контактами. Поможешь понять что это и с чем едят

  5. #4

    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    236
    Спасибо Благодарностей отдано 
    91
    Спасибо Благодарностей получено 
    24
    Поблагодарили
    20 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Всерьез не разбирался, но знаю что это либа (часть llvm) для эмуляции неподдерживаемых напрямую (на каком-либо процессоре) операций. Насколько я понимаю, она просто генерит ir-код используя доступные на процессоре операции. (т.е. полезно для быстрой реализации всяких умножений/делений, операций с разрядностью больше 8 и т.д.).
    Чтоб найти примеры использования просто поищи RTLIB в коде существующих таргетов.
    (ну контакты тоже сейчас скину в личку на всякий случай, хотя думаю что лучше на форуме все обсуждать, может это будет способствовать всеобщему brainstorming-у )

  6. #5

    Регистрация
    14.08.2006
    Адрес
    Владимир
    Сообщений
    4,581
    Спасибо Благодарностей отдано 
    64
    Спасибо Благодарностей получено 
    112
    Поблагодарили
    97 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от mastermind Посмотреть сообщение
    Насколько я понимаю, она просто генерит ir-код используя доступные на процессоре операции. (т.е. полезно для быстрой реализации всяких умножений/делений, операций с разрядностью больше 8 и т.д.).
    Вот это было бы очень здорово. Компилер нужен именно с поддержкой 32-битных типов (хотя бы целочисленных), ибо 8/16 битных С-компилеров для Z80/8080 и так пруд пруди.
    Лучше сделать и жалеть, чем не сделать и жалеть.

    Некоторые из моих поделок тут: https://github.com/serge-404

  7. #6

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Error404 Посмотреть сообщение
    Вот это было бы очень здорово. Компилер нужен именно с поддержкой 32-битных типов (хотя бы целочисленных), ибо 8/16 битных С-компилеров для Z80/8080 и так пруд пруди.
    Ну уж нет! стандартный float тоже надо. а libm - портируется...

  8. #7

    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Ну уж нет! стандартный float тоже надо. а libm - портируется...
    Стандартный float сделать можно, но для этих целей нужно будет делать библиотеку уже. Честно говоря я не силен в работе с типом float и хороших быстрых функций наваять сам не смогу, поэтому если у кого-то есть готовые библиотеки для работы с float, то буду очень этому рад. Хм.. что за libm?
    Последний раз редактировалось EARL; 02.11.2012 в 19:02.

  9. #8

    Регистрация
    27.01.2005
    Сообщений
    924
    Спасибо Благодарностей отдано 
    28
    Спасибо Благодарностей получено 
    193
    Поблагодарили
    154 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Стандартный float сделать можно, но для этих целей нужно будет делать библиотеку уже. Честно говоря я не силен в работе с типом float и хороших быстрых функций наваять сам не смогу, поэтому если у кого-то есть готовые библиотеки для работы с float, то буду очень этому рад. Хм.. что за libm?
    Сам C поддерживает только + - * / для флоата. Остальное - внешнаяя библиотека libm.

    Сделаешь эти 4 функции (пусть не оптимально пока что) - и хватит. Главное, чтобы флоат - был Сшним флоатом по стандарту, а не каким-то извратом.

    Та сейчас на оптимизации не морочься - главное функционал. Пока функционала нет - и оптимизировать нечего.

  10. #9

    Регистрация
    17.01.2006
    Адрес
    Тамбов
    Сообщений
    97
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    0
    Поблагодарили
    0 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Имеется код сравнения двух чисел:
    Код:
        LD A,arg1
        CP arg2
        JP (CC),label
    CC - флаг условия.
    arg1, arg2 - числа для сравнения вида arg1 [условие] arg2, где условие может быть одним из всевозможных вариантов (>, <, ==, !=, >=, <=).
    Также сравниваемые значения могут быть двух типов: знаковые и беззнаковые.

    Для обоих типов:
    == - Z
    != - NZ
    Для беззнаковых:
    < - C
    >= - NC
    Для знаковых:
    < - M (для знаковых)
    > - P (для знаковых)

    Требуется помощь в составлении полной таблицы условия - флаги.

    Знаю, что для всех условий в Z80 не найдутся флаги, поэтому найти нужно хотя бы половину, а остальные можно будет инвертировать.
    Код:
        LD A,arg1
        CP arg2
        JP (CC),cont
        JP label
    cont:

  11. #10

    Регистрация
    20.02.2008
    Адрес
    Siauliai, Lithuania
    Сообщений
    367
    Спасибо Благодарностей отдано 
    42
    Спасибо Благодарностей получено 
    3
    Поблагодарили
    3 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)
    Альтернативная прошивка для тестера мелкой логики на Мега8515: http://www.8bit.lt/ru/ic-tester

    Этот пользователь поблагодарил Protom за это полезное сообщение:

    Oleg N. Cher(21.01.2024)

Страница 5 из 13 ПерваяПервая 123456789 ... ПоследняяПоследняя

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

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

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

Ваши права

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