mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-10-29 23:12:55 +01:00
8a9a382ab2
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. llvm-svn: 208104
26 lines
687 B
LLVM
26 lines
687 B
LLVM
; RUN: llc < %s -mtriple=arm-apple-darwin | FileCheck %s
|
|
; RUN: llc < %s -mtriple=arm-linux-gnueabi | FileCheck %s
|
|
|
|
define i32 @get_stack() nounwind {
|
|
entry:
|
|
; CHECK-LABEL: get_stack:
|
|
; CHECK: mov r0, sp
|
|
%sp = call i32 @llvm.read_register.i32(metadata !0)
|
|
ret i32 %sp
|
|
}
|
|
|
|
define void @set_stack(i32 %val) nounwind {
|
|
entry:
|
|
; CHECK-LABEL: set_stack:
|
|
; CHECK: mov sp, r0
|
|
call void @llvm.write_register.i32(metadata !0, i32 %val)
|
|
ret void
|
|
}
|
|
|
|
declare i32 @llvm.read_register.i32(metadata) nounwind
|
|
declare void @llvm.write_register.i32(metadata, i32) nounwind
|
|
|
|
; register unsigned long current_stack_pointer asm("sp");
|
|
; CHECK-NOT: .asciz "sp"
|
|
!0 = metadata !{metadata !"sp\00"}
|