如何在LLVM程序集中实现push和pop?

时间:2011-05-30 23:26:59

标签: assembly stack llvm instructions

我想在LLVM程序集中实现推送和弹出操作。

alloca指令不遵循stack,push和pop的概念。

示例:

PUSH
86

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

pushl  %eax

MIPS

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

POP
86

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

popl  %eax

MIPS

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

编辑1:

我需要一个独立于平台的解决方案。

第一
我想使用堆栈的顶部来存储临时对象。

表达式“a * b + c * d + e * f”需要存储三次乘法的结果,操作数是类的大对象,运算符是重载的。操作“a * b”将采用许多指令,“a”和“b”在乘法过程中不能被修改,这意味着由“a * b”产生的对象不能使用“a”的相同存储位置或“b”。

在假设语言的代码中,

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

“& Object()”将在堆栈上创建一个对象并获取其指针,指针是函数的参数,并且函数返回后将删除该对象。

第二
我想优化递归函数。我想将递归函数转换为迭代函数,并使用堆栈来推送稍后将使用的数据。我不能使用数组,因为我不知道堆栈中最大数量的递归调用。

1 个答案:

答案 0 :(得分:2)

如果你想“只是”推送和弹出 - 那么你一定要使用内联汇编程序。

如果要以这种方式扩展LLVM IR,则应首先定义clean语义。例如。这应该如何与后端插入的堆栈移动进行交互,如果你在基本块的中间推动没有任何弹出等会发生什么。但是,这似乎不是一个好主意,为什么你需要这个吗?