User Tag List

Страница 4 из 13 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 125

Тема: LLVM Backend для Z80

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

    По умолчанию

    В llvm есть такие операции как усечение значений и расширение. Например усечением 16 битного слова будет являться 8 бит, т.е. 1 байт. Это легко реализуется, например, усеченным значением регистра HL будет регистр L.
    Теперь о расширении значений. Всего имеется 3 вида расширений:
    1. zext - расширение с обнулением старшей части. Например расширение регистра A в регистра HL будет выглядеть так:
    Код:
                   LD L,A
                   LD H,#00
    2. anyext - расширение с неопределенной старшей частью:
    Код:
                   LD L,A
    3. sext - знаковое расширение. Т.е. если 7 бит равен единице, то старшая часть заполняется единицами. Что-то вроде этого
    Код:
                   LD L,A
                   LD H,#00
                   BIT 7,A
                   JR Z,NO_SIGN
                   LD H,#FF
    NO_SIGN:
    Пример написал для большего понимания. Посоветуйте как эффективнее и короче можно сделать знаковое расширение.
    Последний раз редактировалось EARL; 21.10.2012 в 13:57.

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

  3. #32
    Master
    Регистрация
    27.01.2005
    Сообщений
    920
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    189
    Поблагодарили
    150 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Может так?

    Код:
    ; Изначально - в А число
                   LD L,A            ; Младший байт
                   AND #80h       ; Проверка старшего бита на знак
                   RLA                ; CY = старший бит из А, А=0
                   SBC A,#00      ; A=A-CY (0, если +, FF, если -)
                   LD H,A            ; Сташий байт HL= расширенное со знаком число

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

    По умолчанию

    Цитата Сообщение от SfS Посмотреть сообщение
    Может так?

    Код:
    ; Изначально - в А число
                   LD L,A            ; Младший байт
                   AND #80h       ; Проверка старшего бита на знак
                   RLA                ; CY = старший бит из А, А=0
                   SBC A,#00      ; A=A-CY (0, если +, FF, если -)
                   LD H,A            ; Сташий байт HL= расширенное со знаком число
    Да, я думаю этот вариант пока лучше подойдет, т.к. в нём нет никаких условных/безусловных переходов, т.е. все действия выполняются в пределах одного так называемого BasicBlock (http://ru.wikipedia.org/wiki/Basic_block). Если будут в дальнейшем варианты получше, то заменить всегда можно.
    Последний раз редактировалось EARL; 21.10.2012 в 15:05.

  5. #34
    Activist
    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    233
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    19 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Я когда-то тоже начинал делать backend. Выложил в dropbox: https://dl.dropbox.com/u/12936792/lib-Target-Z80.tar.gz
    Предупреждение: там могут быть не то что ляпы, а тупейшие/грубейшие ошибки Это не более чем заготовка, сделанная в процессе чтения документации (т.е. без всеобъемлющего понимания всех аспектов работы llvm) предназначенная для дальнейшего пиления.
    Тем не менее надеюсь что там можно найти и позаимствовать какие-нить полезные идеи.
    Последний раз редактировалось mastermind; 21.10.2012 в 15:49.

  6. #35
    Super Moderator Аватар для Alex Rider
    Регистрация
    07.02.2008
    Адрес
    г. Рязань
    Сообщений
    2,914
    Спасибо Благодарностей отдано 
    30
    Спасибо Благодарностей получено 
    94
    Поблагодарили
    33 сообщений
    Mentioned
    4 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от EARL Посмотреть сообщение
    Посоветуйте как эффективнее и короче можно сделать знаковое расширение.
    Код:
            ld l,a
            rlca
            sbc a,a
            ld h,a

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

    Oleg N. Cher (21.01.2024)

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

    По умолчанию

    Цитата Сообщение от mastermind Посмотреть сообщение
    Я когда-то тоже начинал делать backend. Выложил в dropbox: https://dl.dropbox.com/u/12936792/lib-Target-Z80.tar.gz
    Предупреждение: там могут быть не то что ляпы, а тупейшие/грубейшие ошибки Это не более чем заготовка, сделанная в процессе чтения документации (т.е. без всеобъемлющего понимания всех аспектов работы llvm) предназначенная для дальнейшего пиления.
    Тем не менее надеюсь что там можно найти и позаимствовать какие-нить полезные идеи.
    Спасибо! Гляну исходники. Может быть что-то и правда пригодится)

    Цитата Сообщение от Alex Rider Посмотреть сообщение
    Код:
            ld l,a
            rlca
            sbc a,a
            ld h,a
    Вот это хороший вариант! Спасибо.

  9. #37
    Activist
    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    233
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    19 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Немного комментариев по поводу особенностей моей заготовки:

    В документации где-то было сказано что "ultimate design goal" или вроде того - чтобы можно было модель cpu (backend) сделать полностью с помощью tablegen. (.td-файлы)
    В русле стремления к этому например были приняты такие решения:

    - группировать регистры (в классы) по наборам инструкций в которых они могут быть использованы (отсюда например такие классы как R16_BC_DE_HL, R16_BC_DE_IX_SP и т.д.) + соответствующая группировка инструкций,

    - операции обмена между регистрами реализовать с помощью "виртуальных регистров", например (упрощенно):
    Код:
    def V_DEHL : RegisterWithSubRegs<"v_dehl", [DE,HL]>;
    def V_HLDE : RegisterWithSubRegs<"v_hlde", [HL,DE]>;
    
    let Defs = [DE,HL] in
    def EX_DE_HL : I<0xEB, RawFrm, (outs), (ins), "ex\tde, hl", [(set V_DEHL, V_HLDE)]>;
    - опкоды (точнее биты которые присутствуют (=1) во всех вариациях инструкций, иначе говоря этакие "базовые опкоды") также присутствуют в .td для дальнейшего использования в реализации MC и т.п.
    Последний раз редактировалось mastermind; 21.10.2012 в 16:23.

  10. #38
    Master
    Регистрация
    27.01.2005
    Сообщений
    920
    Спасибо Благодарностей отдано 
    27
    Спасибо Благодарностей получено 
    189
    Поблагодарили
    150 сообщений
    Mentioned
    2 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Уважаемый аффтор!
    Не забываем сюда писать, как дела Все ждут, затаив дыхание!

  11. #39
    Member Аватар для EARL
    Регистрация
    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.

  12. #40
    Activist
    Регистрация
    21.08.2009
    Адрес
    Cyprus
    Сообщений
    233
    Спасибо Благодарностей отдано 
    84
    Спасибо Благодарностей получено 
    23
    Поблагодарили
    19 сообщений
    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 из 13 ПерваяПервая 12345678 ... ПоследняяПоследняя

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

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

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

Ваши права

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