Важная информация

User Tag List

Страница 2 из 2 ПерваяПервая 12
Показано с 11 по 20 из 20

Тема: ABS и SGN в машкоде

  1. #11
    Master Аватар для SaNchez
    Регистрация
    22.12.2007
    Адрес
    г. Владивосток
    Сообщений
    915
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    ;sgn
    +
    jr nc, -> 0..127
    jr c, -> -128..-1
    Если переходы не нужны, то можно еще такт сэкономить:


    rlc l
    ret z
    sbc a,a
    or 1
    ld l,a

  2. #12
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,628
    Спасибо Благодарностей отдано 
    2,212
    Спасибо Благодарностей получено 
    144
    Поблагодарили
    110 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Что значит "если переходы не нужны"? :-)

  3. #13
    Master Аватар для SaNchez
    Регистрация
    22.12.2007
    Адрес
    г. Владивосток
    Сообщений
    915
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    char предложил общий вариант, но если использовать только для функции, можно один такт выиграть, поменяв "set 0,l" на "or 1".

    signed char Basic_SGN (signed char x) __z88dk_fastcall {
    __asm
    RLC L
    RET Z
    SBC A,A
    OR 1
    LD L,A
    __endasm;
    } //Basic_SGN
    Последний раз редактировалось SaNchez; 02.01.2017 в 07:01.

  4. #14
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    хотите линейную, и самую жесть? их есть у нас ->

    ld a,l
    rla
    sbc a,a
    sub l
    adc a,l
    ld l,a

  5. #15
    Master Аватар для SaNchez
    Регистрация
    22.12.2007
    Адрес
    г. Владивосток
    Сообщений
    915
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    12
    Поблагодарили
    6 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Гениально!

  6. #16
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,619
    Спасибо Благодарностей отдано 
    1,246
    Спасибо Благодарностей получено 
    1,812
    Поблагодарили
    697 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    хотите линейную, и самую жесть? их есть у нас ->

    ld a,l
    rla
    sbc a,a3
    sub l
    adc a,l
    ld l,a
    Пиши демы)

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

  8. #17
    Activist
    Регистрация
    15.01.2005
    Сообщений
    201
    Спасибо Благодарностей отдано 
    0
    Спасибо Благодарностей получено 
    7
    Поблагодарили
    7 сообщений
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Цитата Сообщение от Titus Посмотреть сообщение
    Пиши демы)
    как только, так... уже )

    для себя вынес из темы "две новейших двадцатитактных команды", еще бы знать куда их теперь... )

    ;sgn c
    ld a,c
    rla
    sbc a,a
    sub c
    adc a,c

    ;sgn c,a
    ld c,a
    rla
    sbc a,a
    sub c
    adc a,c

  9. #18
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,619
    Спасибо Благодарностей отдано 
    1,246
    Спасибо Благодарностей получено 
    1,812
    Поблагодарили
    697 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Цитата Сообщение от char Посмотреть сообщение
    как только, так... уже )
    Как называются?

  10. #19
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,628
    Спасибо Благодарностей отдано 
    2,212
    Спасибо Благодарностей получено 
    144
    Поблагодарили
    110 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Titus, только доглядел. Это мега-код! :-) По сравнению с оригинальной процедурой:
    Код:
    signed int Basic_ABSI (signed int x) __z88dk_fastcall {
    __asm
        BIT  7,H     ;  8
        RET  Z       ; 11/5
        EX   DE,HL   ;  4
        XOR  A       ;  4
        LD   L,A     ;  4
        LD   H,A     ;  4
        SBC  HL,DE   ; 15 => 44/19
    __endasm;
    } //Basic_ABSI
    Получилось:
    Код:
    signed int Basic_ABSI (signed int x) __z88dk_fastcall {
    __asm // Code by Titus
        LD   A,H     ;  4
        OR   A       ;  4
        RET  P       ; 11/5
        CPL          ;  4
        LD   H,A     ;  4
        LD   A,L     ;  4
        CPL          ;  4
        LD   L,A     ;  4
        INC  HL      ;  6 => 39/19
    __endasm;
    } //Basic_ABSI
    Тактов кушает меньше и не портит пару DE! А байтиков столько же!

    В Basic.h добавляю ключик:
    Код:
    extern signed int Basic_ABSI (signed int x) __z88dk_fastcall __preserves_regs(b,c,d,e,iyl,iyh);
    - и оптимизатор точно знает, какие регистры сохраняет функция. И использует эту информацию, чтобы сделать код лучше.

    - - - Добавлено - - -

    Эх, всё-таки не зря открыл тему =) Благодарю!

  11. #20
    Veteran Аватар для Oleg N. Cher
    Регистрация
    24.08.2007
    Адрес
    Днепропетровская обл.
    Сообщений
    1,628
    Спасибо Благодарностей отдано 
    2,212
    Спасибо Благодарностей получено 
    144
    Поблагодарили
    110 сообщений
    Mentioned
    1 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    На идеях char'а и SaNchez'а. SGN для байтов:

    Код:
    signed char Basic_SGN (signed char x) __z88dk_fastcall {
    __asm // Code by char & SaNchez
        RLC  L
        RET  Z
        SBC  A
        OR   #1
        LD   L,A
    __endasm;
    } //Basic_SGN
    Для слов:
    Код:
    signed char Basic_SGNI (signed int x) __z88dk_fastcall {
    __asm // Code by char & SaNchez
        LD   A,L
        OR   H
        RET  Z
        RLC  H
        SBC  A
        OR   #1
        LD   L,A
    __endasm;
    } //Basic_SGNI

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

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

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

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

Похожие темы

  1. как поставить функцию ABS, USR?
    от REMR в разделе Для начинающих
    Ответов: 1
    Последнее: 04.01.2010, 19:30

Ваши права

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