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

User Tag List

Страница 1 из 2 12 ПоследняяПоследняя
Показано с 1 по 10 из 20

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

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

    По умолчанию ABS и SGN в машкоде

    Всем привет.
    Покритикуйте мою реализацию функций ABS и SGN для байта и слова, может можно как-то оптимизировать.
    Байтовый аргумент поступает в регистре L, результат возвращается в нём же. Слова - в паре HL. Таковы соглашения модели вызова __z88dk_fastcall.

    Код:
    /*--------------------------------- Cut here ---------------------------------*/
    signed char Basic_ABS (signed char x) __z88dk_fastcall {
    __asm
        BIT  7,L
        RET  Z
        XOR  A
        SUB  L
        LD   L,A
    __endasm;
    } //Basic_ABS
    
    /*--------------------------------- Cut here ---------------------------------*/
    signed int Basic_ABSI (signed int x) __z88dk_fastcall {
    __asm
        BIT  7,H
        RET  Z
        EX   DE,HL
        XOR  A
        LD   L,A
        LD   H,A
        SBC  HL,DE
    __endasm;
    } //Basic_ABSI
    
    /*--------------------------------- Cut here ---------------------------------*/
    signed char Basic_SGN (signed char x) __z88dk_fastcall {
    __asm
        LD   A,L
        OR   L
        RET  Z
        BIT  7,L
        LD   L,#0xFF
        RET  NZ
        LD   L,#1
    __endasm;
    } //Basic_SGN
    
    /*--------------------------------- Cut here ---------------------------------*/
    signed char Basic_SGNI (signed int x) __z88dk_fastcall {
    __asm
        LD   A,H
        OR   L
        RET  Z
        BIT  7,H
        LD   L,#0xFF
        RET  NZ
        LD   L,#1
    __endasm;
    } //Basic_SGNI

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

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

    По умолчанию

    Идеально, оптимизировать нечего

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

    По умолчанию

    Цитата Сообщение от Oleg N. Cher Посмотреть сообщение
    Код:
            XOR  A
            LD   L,A
            LD   H,A
    Код:
            LD L,0
            LD H,L
    На такт быстрее.
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

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

    По умолчанию

    Не обнулил флаг C.

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

    По умолчанию

    Точно :-(
    ZX Evolution Rev C + ZXM-SoundCard Extreme + NeoGS.

  7. #6
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Код:
    bit 7,h		;8
    ret z		;5 11
    
    ex de,hl	;4
    xor a		;4
    ld l,a		;4
    ld h,a		;4
    sbc hl,de	;15
    ret		;10
    
    		;19 54 оригинальная процедура
    Код:
    bit 7,h		;8
    ret z		;5 11
    
    ld a,h		;4
    cpl		;4
    ld h,a		;4
    ld a,l		;4
    cpl		;4
    ld l,a		;4
    inc hl		;6
    ret		;10
    
    		;19 53
    Код:
    ld a,h		;4
    cp $80		;7 возможно +-$01
    ret c		;5 11
    
    cpl		;4
    ld h,a		;4
    ld a,l		;4
    cpl		;4
    ld l,a		;4
    inc hl		;6
    ret		;10
    
    		;22 52
    - - - Добавлено - - -

    Цитата Сообщение от Alex Rider
    XOR A
    LD L,A
    LD H,A
    LD L,0
    LD H,L

    На такт быстрее.
    LD HL,$0000 в таком случае на 2 такта быстрее
    Последний раз редактировалось NEO SPECTRUMAN; 01.01.2017 в 17:47.

  8. #7
    Guru
    Регистрация
    08.10.2005
    Адрес
    Москва
    Сообщений
    13,560
    Спасибо Благодарностей отдано 
    1,223
    Спасибо Благодарностей получено 
    1,754
    Поблагодарили
    683 сообщений
    Mentioned
    67 Post(s)
    Tagged
    1 Thread(s)

    По умолчанию

    Не проверял. На вскидку так:

    Код:
    		LD	A,H	; 4
    		OR	A	; 4
    		RET	P	; 5 / 11
    		
    		CPL		; 4
    		LD	H,A	; 4
    		LD	A,L	; 4
    		CPL		; 4
    		LD	L,A	; 4
    		INC	HL	; 6
    		RET		; 10
    		
    				; 19 / 49
    Код:
    		LD	A,$FF	; 7
    		XOR	H	; 4
    		RET	M	; 5 / 11
    		
    		LD	H,A	; 4
    		LD	A,L	; 4
    		CPL		; 4
    		LD	L,A	; 4
    		INC	HL	; 6
    		RET		; 10
    	
    				; 22 / 48

  9. #8
    Banned
    Регистрация
    22.05.2011
    Адрес
    г. Дзержинск, Украина
    Сообщений
    6,841
    Спасибо Благодарностей отдано 
    483
    Спасибо Благодарностей получено 
    658
    Поблагодарили
    512 сообщений
    Mentioned
    10 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    SGN можно запилить 100500-ю способами

    Код:
    ;оригинальная процедура
        LD   A,L		;4
        OR   L		;4
        RET  Z		;5 11
        BIT  7,L		;8
        LD   L,#0xFF	;7
        RET  NZ		;5 11
        LD   L,#1		;7
        RET			;10
    			;+=50 0=19 -=39
    			;36 в среднем ; 44,5 в среднем без 0
    с ходу придумалось так
    Код:
    ld a,l		;4
    rlca		;4    возможно rla (нужно чтоб флаг С не попадал в А)
    
    jp c,l1		;10 (7 12 JR)
    
    or a		;4
    ret z		;5 11
    ld l,$01	;7
    ret		;10
    
    l1
    ld l,$FF	;7
    ret		;10
    
    		;с использованием JP
    		;+=44 0=33 -=35
    		;37,3 в среднем ;39,5 в среднем без 0
    
    		;с использованием JR
    		;+=41 0=30 -=37
    		;36 в среднем ; 39 в среднем без 0
    думаю можно и в 600 раз быстрее как минимум
    кажется мне оптимизировать процедуру чтоб проверка на 0(1 против 255 других входящих значений) выполнялась быстрей всего нет смысла
    правда я хз в какой ситуации применять sgn

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

    вы и правда так кодите
    мну *****кодер 80 уровня

    Я только сегодня узнал что такое sgn
    глядя на код в самом верху

    кто мне не дает так кодить?

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

    MOAR SPEED!!!
    Код:
    rlc l		;8
    ret z		;5 11
    
    jp c,l1		;10 (7 12 JR)
    ld l,$01	;7
    ret		;10
    
    l1
    ld l,$FF	;7
    ret		;10
    
    		;с использованием JP
    		;+=40 0=19 -=40
    		;33 в среднем ;40 в среднем без 0
    
    		;с использованием JR
    		;+=37 0=19 -=42
    		;32,6 в среднем ;39,5 в среднем без 0
    АND MOAR!!!!
    Код:
    rlc l		;8
    ret z		;5 11
    
    ld l,$01	;7	;ld l,$FF
    
    ret nc		;5 11	;ret c
    
    ld l,$FF	;7	;ld l,$01
    ret		;10
    
    		;-=31 0=19 +=42
    		;30,6 в среднем ;36,5 в среднем без 0
    
    		;легко реверсится в
    		;-=42 0=19 +=31 (если положительные числа встречаются чаще(а они наверное встречаются чаще))
    - - - Добавлено - - -


    Код:
    ;оригинальная процедура
        BIT  7,L		8
        RET  Z		5 11
        XOR  A		4
        SUB  L		4
        LD   L,A		4
        RET		10
            ;19 35

    Код:
    xor a		;4
    sub l		;4
    ret m		;5 11
    
    ld l,a		;4
    ret		;10
    
    		;19 27 
    		;по ходу дает ложный результат при $00 и $80 перепроверьте кто нить!!!
    Последний раз редактировалось NEO SPECTRUMAN; 01.01.2017 в 21:37.

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

    По умолчанию

    А какой результат должно дать ABS($80)? Разве не $80? Просто у него нет симметричного положительного :-)

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

    Код:
    /*--------------------------------- Cut here ---------------------------------*/
    signed char Basic_SGN (signed char x) __z88dk_fastcall { // Code by NEO SPECTRUMAN
    __asm
        RLC  L        ; 8
        RET  Z        ; 5 11
        LD   L,#1     ; 7
        RET  NC       ; 5 11
        LD   L,#0xFF  ; 7
    __endasm;
    } //Basic_SGN
    NEO SPECTRUMAN, зачётный код, респект! Я бы так не додумался. :-) Вот что значит опыт низкоуровневого кодинга. У меня он небольшой. Интересно, как бы Вы оптимизировали Laser2 :-)

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

    По умолчанию

    ;sgn

    rlc l
    ret z
    sbc a,a
    ld l,a
    set 0,l


    +
    jr nc, -> 0..127
    jr c, -> -128..-1
    Последний раз редактировалось char; 02.01.2017 в 04:05.

Страница 1 из 2 12 ПоследняяПоследняя

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

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

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

Похожие темы

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

Ваши права

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