Как реализовать push и pop в сборке LLVM? - PullRequest
3 голосов
/ 31 мая 2011

Я хочу реализовать операции push и pop в сборке LLVM.

Инструкция alloca не соответствует концепции стека, push и pop.

Примеры:

PUSH
x86

subl  $4, %esp
movl  %eax, 0(%esp)

или

pushl  %eax

mips

addi  $sp, $sp, -4
sw    $t2, 0($sp)

POP
x86

movl  0(%esp), %eax
addl  $4, %esp

или

popl  %eax

mips

lw    $t2, 0($sp)
addi  $sp, $sp, 4

EDIT 1:

Мне нужна платформа-независимое решение.

Первый
Я хочу использовать вершину стека для хранения временных объектов.

Выражение "a * b + c * d +e * f "нужно будет хранить результат трех умножений, операнды являются большими объектами класса, а операторы перегружены.Операция «a * b» будет принимать много инструкций, «a» и «b» не могут быть изменены во время умножения, это означает, что объект, который будет получен из «a * b», не может использовать то же место памяти «a» или"b".

В коде на гипотетическом языке

call_function( &Object(), &(a + b) );

"& Object ()" создаст объект в стеке и получит его указатель, указатель является параметром дляФункция и объект будут удалены после возврата функции.

Секунда
Я хочу оптимизировать рекурсивные функции.Я хочу преобразовать рекурсивную функцию в итеративную функцию и использовать стек для передачи данных, которые будут использоваться позже.Я не могу использовать массив, потому что я не знаю наибольшего числа рекурсивных вызовов, которые будут в стеке.

1 Ответ

2 голосов
/ 31 мая 2011

Если вы хотите просто «нажать» и «вытолкнуть», то вам обязательно следует использовать встроенный ассемблер.

Если вы хотите расширить LLVM IR таким образом, вам следует сначала определить чистую семантику.Например, как это должно взаимодействовать с движениями стека, вставленными бэкендом, что произойдет, если у вас будет толчок в середине основного блока без какой-либо поп-функции и т. Д. Однако это не кажется хорошей идеей, почемутебе это вообще нужно?

...