| 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"} |
| 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"} |
| 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"} |
| 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"} |
| 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"} |
| 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"} |
| 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"} |