Что значит "если переходы не нужны"? :-)
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.
хотите линейную, и самую жесть? их есть у нас ->
ld a,l
rla
sbc a,a
sub l
adc a,l
ld l,a
Гениально!
С любовью к вам, Yandex.Direct
Размещение рекламы на форуме способствует его дальнейшему развитию
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
Тактов кушает меньше и не портит пару DE! А байтиков столько же!Код: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
В Basic.h добавляю ключик:
- и оптимизатор точно знает, какие регистры сохраняет функция. И использует эту информацию, чтобы сделать код лучше.Код:extern signed int Basic_ABSI (signed int x) __z88dk_fastcall __preserves_regs(b,c,d,e,iyl,iyh);
- - - Добавлено - - -
Эх, всё-таки не зря открыл тему =) Благодарю!
На идеях 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
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)