3

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

alloca 指令不遵循堆栈、推送和弹出的概念。

例子:


x86

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

或者

pushl  %eax

mips

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

流行音乐
x86

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”的相同内存位置或“乙”。

在假设语言的代码中,

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

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

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

4

1 回答 1

2

如果您想要“只是”推送和弹出 - 那么您绝对应该使用内联汇编程序。

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

于 2011-05-31T06:11:42.877 回答