25 changes: 25 additions & 0 deletions llvm/test/CodeGen/ARM/stackpointer.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
; 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"}
14 changes: 14 additions & 0 deletions llvm/test/CodeGen/ARM64/named-reg-alloc.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
; RUN: not llc < %s -mtriple=arm64-apple-darwin 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-linux-gnueabi 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; FIXME: Include an allocatable-specific error message
; CHECK: Invalid register name global variable
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

declare i32 @llvm.read_register.i32(metadata) nounwind

!0 = metadata !{metadata !"x5\00"}
13 changes: 13 additions & 0 deletions llvm/test/CodeGen/ARM64/named-reg-notareg.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
; RUN: not llc < %s -mtriple=arm64-apple-darwin 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=arm64-linux-gnueabi 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; CHECK: Invalid register name global variable
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

declare i32 @llvm.read_register.i32(metadata) nounwind

!0 = metadata !{metadata !"notareg\00"}
24 changes: 24 additions & 0 deletions llvm/test/CodeGen/ARM64/stackpointer.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
; RUN: llc < %s -mtriple=arm64-linux-gnu | FileCheck %s

define i64 @get_stack() nounwind {
entry:
; CHECK-LABEL: get_stack:
; CHECK: mov x0, sp
%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: mov sp, x0
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("sp");
; CHECK-NOT: .asciz "sp"
!0 = metadata !{metadata !"sp\00"}
14 changes: 14 additions & 0 deletions llvm/test/CodeGen/X86/named-reg-alloc.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
; RUN: not llc < %s -mtriple=x86_64-apple-darwin 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=x86_64-linux-gnueabi 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; FIXME: Include an allocatable-specific error message
; CHECK: Invalid register name global variable
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

declare i32 @llvm.read_register.i32(metadata) nounwind

!0 = metadata !{metadata !"eax\00"}
13 changes: 13 additions & 0 deletions llvm/test/CodeGen/X86/named-reg-notareg.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
; RUN: not llc < %s -mtriple=x86_64-apple-darwin 2>&1 | FileCheck %s
; RUN: not llc < %s -mtriple=x86_64-linux-gnueabi 2>&1 | FileCheck %s

define i32 @get_stack() nounwind {
entry:
; CHECK: Invalid register name global variable
%sp = call i32 @llvm.read_register.i32(metadata !0)
ret i32 %sp
}

declare i32 @llvm.read_register.i32(metadata) nounwind

!0 = metadata !{metadata !"notareg\00"}
25 changes: 25 additions & 0 deletions llvm/test/CodeGen/X86/stackpointer.ll
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
; 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"}