mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-15 04:30:12 +00:00
22f779d1fd
This patch implements the infrastructure to use named register constructs in programs that need access to specific registers (bare metal, kernels, etc). So far, only the stack pointer is supported as a technology preview, but as it is, the intrinsic can already support all non-allocatable registers from any architecture. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@208104 91177308-0d34-0410-b5e6-96231b3b80d8
26 lines
702 B
LLVM
26 lines
702 B
LLVM
; RUN: llc < %s -mtriple=x86_64-apple-darwin | FileCheck %s
|
|
; RUN: llc < %s -mtriple=x86_64-linux-gnueabi | FileCheck %s
|
|
|
|
define i64 @get_stack() nounwind {
|
|
entry:
|
|
; CHECK-LABEL: get_stack:
|
|
; CHECK: movq %rsp, %rax
|
|
%sp = call i64 @llvm.read_register.i64(metadata !0)
|
|
ret i64 %sp
|
|
}
|
|
|
|
define void @set_stack(i64 %val) nounwind {
|
|
entry:
|
|
; CHECK-LABEL: set_stack:
|
|
; CHECK: movq %rdi, %rsp
|
|
call void @llvm.write_register.i64(metadata !0, i64 %val)
|
|
ret void
|
|
}
|
|
|
|
declare i64 @llvm.read_register.i64(metadata) nounwind
|
|
declare void @llvm.write_register.i64(metadata, i64) nounwind
|
|
|
|
; register unsigned long current_stack_pointer asm("rsp");
|
|
; CHECK-NOT: .asciz "rsp"
|
|
!0 = metadata !{metadata !"rsp\00"}
|