Сейчас работаю над сабжем. Если кто-то не в курсе, то вот пара ссылок:
http://ru.wikipedia.org/wiki/LLVM
http://habrahabr.ru/post/47878/
http://llvm.org/
На данном этапе возник вопрос как эффективнее выделять память на стеке, т.е. интерпретировать команду alloca:
Код:
<result> = alloca <type>[, <ty> <NumElements>][, align <alignment>]
"Честный" способ выделения памяти выглядит примерно так:
Код:
push hl
ld hl,-size
add hl,sp
ld sp,hl
...
ld hl,size
add hl,sp
ld sp,hl
pop hl
ret
В данном случае существует минус в том, что обращаться к переменным выделенным на стеке придется следующим образом:
Код:
ld hl,offset
add hl,sp
ld e,(hl)
inc hl
ld d,(hl)
Получается 7 байт на то, чтобы считать слово на стеке. Как-то не очень хорошо))
С другой стороны можно вместо HL использовать IX, тогда обращение будет выглядеть более приятно:
Код:
ld e,(ix+offset)
ld d,(ix+offset+1)
6 байт и всего две команды, но тут у нас выделение и освобождение памяти на стеке будет чуть больше размером, т.к. работать будем с IX.
Если предположить, что наша программа будет находится в озу, то можно придти к такому варианту выделения памяти:
Код:
ld (.stack),sp
ld hl,-size
add hl,sp
ld sp,hl
...
ld sp,0
.stack $-2
ret
Дополнительно к этому можно добавить опцию, указывающую будет ли программа работать в озу или пзу, чтобы генерировать нужный код.
Собственно вопросов всего три:
1) Как лучше выделять память на стеке? Какой регистр использовать - HL или IX?
2) Как обращаться к переменным на стеке
3) Использовать лучше "честный" метод или сделать возможность включения более быстрого?
Если еще есть какие-то замечения и/или пожелания по данному вопросу, буду рад выслушать.