[LLVMdev] Named Register Implementation

Jeremy Lakeman Jeremy.Lakeman at gmail.com
Fri Mar 28 18:16:13 PDT 2014


On Sat, Mar 29, 2014 at 1:30 AM, Renato Golin <renato.golin at linaro.org>wrote:

> Folks,
>
> So, I think we kind of agree that some named registers could be
> implemented, and that it should be an intrinsic that passes the name
> of the register down.
>
> This C code:
>
> register unsigned long current_stack_pointer asm("sp");
> unsigned long get_stack_pointer_addr() {
>   return current_stack_pointer;
> }
> void set_stack_pointer_addr(unsigned long addr) {
>   current_stack_pointer = addr;
> }
>
> Would become something like:
>
> define i32 @get_stack_pointer_addr() nounwind {
> entry:
>   %0 = call i32 @llvm.read_register("sp")
>   ret i32 %0
> }
>
> define void @set_stack_pointer_addr(i32 %addr) nounwind {
> entry:
>   call void @llvm.write_register("sp", %addr)
>   ret void
> }
>
>
Should that be something like;

declare void @llvm.write_register.sp(i32 val)
declare i32 @llvm.read_register.sp()

define i32 @get_stack_pointer_addr() nounwind {
entry:
  %0 = call i32 @llvm.read_register.sp()
  ret i32 %0
}

define void @set_stack_pointer_addr(i32 %addr) nounwind {
entry:
  call void @llvm.write_register.sp(%addr)
  ret void
}

Then you don't need to clutter the IR with metadata or a constant i8* to
identify the register.
There's precedent for overloading intrinsics.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20140329/8af554ea/attachment.html>


More information about the llvm-dev mailing list