SDCC output samples
From GbdevWiki
SDCC is a C compiler targeting, among other instruction sets, the Sharp SM83 CPU in the Game Boy. It is commonly used with the GBDK-2020 library to develop Game Boy games. Here are some samples of its output.
memcpy
C source code:
void memcpy(char* dest, char* src, unsigned len) {
while (len--) {
*dest = *src;
dest++;
src++;
}
}
SDCC 4.1.0 compiles it to the following: (View in Compiler Explorer)
_memcpy::
add sp, #-4
ldhl sp, #6
ld a, (hl+)
ld e, (hl)
ldhl sp, #0
ld (hl+), a
ld (hl), e
ldhl sp, #8
ld a, (hl+)
ld e, (hl)
ldhl sp, #2
ld (hl+), a
ld (hl), e
ldhl sp,#10
ld a, (hl+)
ld c, a
ld b, (hl)
00101$:
ld e, c
ld d, b
dec bc
ld a, d
or a, e
jr Z, 00104$
ldhl sp,#2
ld a, (hl+)
ld e, a
ld d, (hl)
ld a, (de)
pop hl
push hl
ld (hl), a
ldhl sp, #0
inc (hl)
jr NZ, 00117$
inc hl
inc (hl)
00117$:
ldhl sp, #2
inc (hl)
jr NZ, 00101$
inc hl
inc (hl)
jr 00101$
00104$:
add sp, #4
ret
Compare a handwritten implementation in assembly language that takes dest in DE, src in HL, and len in BC. (This is the same register allocation used for Zilog Z80's ldir instruction.)
memcpy_loop:
ld a, (hl+)
ld (de), a
dec bc
_memcpy__de_hl_bc::
ld a, b
or a, c
jr nz, memcpy_loop
ret