llvm-6502/test/CodeGen/AArch64/special-reg.ll
Oliver Stannard d811b4bacb [LLVM - ARM/AArch64] Add ACLE special register intrinsics
This patch implements LLVM support for the ACLE special register intrinsics in
section 10.1, __arm_{w,r}sr{,p,64}.

This patch is intended to lower the read/write_register instrinsics, used to
implement the special register intrinsics in the clang patch for special
register intrinsics (see http://reviews.llvm.org/D9697), to ARM specific
instructions MRC,MCR,MSR etc. to allow reading an writing of coprocessor
registers in AArch32 and AArch64. This is done by inspecting the register
string passed to the intrinsic and then lowering to the appropriate
instruction.

Patch by Luke Cheeseman.

Differential Revision: http://reviews.llvm.org/D9699



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@237579 91177308-0d34-0410-b5e6-96231b3b80d8
2015-05-18 16:23:33 +00:00

49 lines
1.1 KiB
LLVM

; RUN: llc < %s -mtriple=aarch64-none-eabi -mcpu=cortex-a57 2>&1 | FileCheck %s
define i64 @read_encoded_register() nounwind {
entry:
; CHECK-LABEL: read_encoded_register:
; CHECK: mrs x0, S1_2_C3_C4_5
%reg = call i64 @llvm.read_register.i64(metadata !0)
ret i64 %reg
}
define i64 @read_daif() nounwind {
entry:
; CHECK-LABEL: read_daif:
; CHECK: mrs x0, DAIF
%reg = call i64 @llvm.read_register.i64(metadata !1)
ret i64 %reg
}
define void @write_encoded_register(i64 %x) nounwind {
entry:
; CHECK-LABEL: write_encoded_register:
; CHECK: msr S1_2_C3_C4_5, x0
call void @llvm.write_register.i64(metadata !0, i64 %x)
ret void
}
define void @write_daif(i64 %x) nounwind {
entry:
; CHECK-LABEL: write_daif:
; CHECK: msr DAIF, x0
call void @llvm.write_register.i64(metadata !1, i64 %x)
ret void
}
define void @write_daifset() nounwind {
entry:
; CHECK-LABEL: write_daifset:
; CHECK: msr DAIFSET, #2
call void @llvm.write_register.i64(metadata !2, i64 2)
ret void
}
declare i64 @llvm.read_register.i64(metadata) nounwind
declare void @llvm.write_register.i64(metadata, i64) nounwind
!0 = !{!"1:2:3:4:5"}
!1 = !{!"daif"}
!2 = !{!"daifset"}