[llvm-dev] HiPE calling convention
denisgolovan via llvm-dev
llvm-dev at lists.llvm.org
Fri Sep 29 04:12:33 PDT 2017
Hi all
I saw presentation http://www.softlab.ntua.gr/~gtsiour/files/erllvm_pres-20111107.pdf
and I have couple question to the HiPE calling convention. I am trying to enable HiPE call for Rust compiler.
That presentation mentioned that:
Virtual registers with “special” use, pinned to hardware registers
(unallocatable).
VM Register AMD64 Register
Native stack pointer %nsp
Heap pointer %r15
Process pointer %rbp
Reading that I am under impression that both r15 and rbp should not be
used in functions marked using "HiPE" calling convention. That's it
looks like r15 and rbp are reserved some purpose (like addressing
dynamic language argument/locals).
However when trying to enable this calling convention I see quite the opposite.
e.g.
0000000000005e30 <hipe_test::test1>:
5e30: 49 01 ef add %rbp,%r15
<========== RBP and R15 contain arguments and RBP is clobbered
5e33: c3 retq
5e34: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
5e3b: 00 00 00
5e3e: 66 90 xchg %ax,%ax
0000000000005e40 <hipe_test::test2>:
5e40: e9 eb ff ff ff jmpq 5e30 <hipe_test::test1>
5e45: 66 2e 0f 1f 84 00 00 nopw %cs:0x0(%rax,%rax,1)
5e4c: 00 00 00
5e4f: 90 nop
0000000000005e50 <hipe_test::main>:
5e50: 55 push %rbp
5e51: 41 57 push %r15
5e53: 41 56 push %r14
5e55: 41 55 push %r13
5e57: 41 54 push %r12
5e59: 53 push %rbx
5e5a: 48 83 ec 58 sub $0x58,%rsp
5e5e: 31 db xor %ebx,%ebx
5e60: 45 31 f6 xor %r14d,%r14d
5e63: 66 66 66 66 2e 0f 1f data16 data16 data16 nopw
%cs:0x0(%rax,%rax,1)
5e6a: 84 00 00 00 00 00
5e70: 4c 89 34 24 mov %r14,(%rsp)
5e74: 48 89 5c 24 08 mov %rbx,0x8(%rsp)
5e79: 4c 8b 3c 24 mov (%rsp),%r15
5e7d: 48 8b 04 24 mov (%rsp),%rax
5e81: 48 8d 40 01 lea 0x1(%rax),%rax
5e85: 48 89 04 24 mov %rax,(%rsp)
5e89: 48 8b 6c 24 08 mov 0x8(%rsp),%rbp
5e8e: e8 ad ff ff ff callq 5e40 <hipe_test::test2>
5e93: 48 8b 5c 24 08 mov 0x8(%rsp),%rbx
I am getting that code for following Rust code.
#[inline(never)]
extern "hipe" fn test1(a1:i64, a2:i64) -> i64 {
a1+a2
}
#[inline(never)]
extern "hipe" fn test2(a1:i64, a2:i64) -> i64 {
test1(a1, a2)
}
fn main() {
for i in 0..100 {
let r=test2(i, i*3);
println!("{}", r);
}
}
Could it be that LLVM is wrong here or I am missing something obvious?
--
Regards,
Denis Golovan
More information about the llvm-dev
mailing list