我想在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()”将在堆栈上创建一个对象并获取其指针,指针是函数的参数,并且函数返回后将删除该对象。
第二
我想优化递归函数。我想将递归函数转换为迭代函数,并使用堆栈来推送稍后将使用的数据。我不能使用数组,因为我不知道堆栈中最大数量的递归调用。
答案 0 :(得分:2)
如果你想“只是”推送和弹出 - 那么你一定要使用内联汇编程序。
如果要以这种方式扩展LLVM IR,则应首先定义clean语义。例如。这应该如何与后端插入的堆栈移动进行交互,如果你在基本块的中间推动没有任何弹出等会发生什么。但是,这似乎不是一个好主意,为什么你需要这个吗?