тест, оптимизация поскорости и там и там
- Code: Select all
/* Fill memory */
//dst - start adress
//val - byte for filled
//cnt - count
static
void test(void* dst, int val, UINT cnt) {
BYTE *d = (BYTE*)dst;
while (cnt--)
*d++ = (BYTE)val;
}
z88dk(сохраняет реги перед вызовом процедур), все аргументы на стеке:
- Code: Select all
._test
ld hl,6 ;const
call l_gintsp ;
.i_5
ld hl,4 ;const
add hl,sp
dec (hl)
ld a,(hl)
inc hl
jr nc,ASMPC+3
dec (hl)
ld h,(hl)
ld l,a
inc hl
ld a,h
or l
jp z,i_6
pop hl
inc hl
push hl
dec hl
ex de,hl
ld hl,8-2 ;const
add hl,sp
call l_gint ;
ld a,l
ld (de),a
jp i_5
.i_6
pop bc
ret
iar(наоборот сохраняет реги в самой процедуре, думаю это правильней). два аргумента в регах(de,bc) и один на стеке:
- Code: Select all
test:
PUSH IY
EXX
PUSH BC
PUSH DE
EXX
PUSH IX
LD IX,0
ADD IX,SP
PUSH DE
EXX
LD C,(IX+10)
LD B,(IX+11)
EXX
; 500. static void test(void* dst,int val,UINT cnt){
PUSH DE
EXX
POP DE
EXX
?0200:
; 501. BYTE *d=(BYTE*) dst;
EXX
PUSH BC
DEC BC
EXX
POP HL
LD A,L
OR H
JR Z,?0199
?0201:
; 502. while(cnt--)
EXX
PUSH DE
INC DE
EXX
POP HL
LD (HL),C
; 503. *d++ = (BYTE) val;
JR ?0200
?0199:
LD SP,IX
POP IX
EXX
POP DE
POP BC
EXX
POP IY
RET
; 504. }
iar оптимизация по размеру(всё равно явно быстрее чем z88dk)
- Code: Select all
test:
CALL ?ENT_AUTO_DIRECT_L09
DEFW 0
PUSH IY
LD E,(IX+8)
LD D,(IX+9)
; 500. static void test(void* dst,int val,UINT cnt){
LD L,(IX+2)
LD H,(IX+3)
PUSH HL
POP IY
?0200:
; 501. BYTE *d=(BYTE*) dst;
LD A,E
LD H,D
DEC DE
OR H
JR Z,?0199
?0201:
; 502. while(cnt--)
LD B,(IX+4)
LD (IY+0),B
; 503. *d++ = (BYTE) val;
INC IY
JR ?0200
?0199:
POP IY
JP ?LEAVE_DIRECT_L09
; 504. }
И да, я в курсе есть оно в библиотеке, это для примера.