1
+ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
1
2
; RUN: llc < %s -mtriple=arm-none-eabi -mcpu=cortex-a8 2>&1 | FileCheck %s --check-prefix=ARM --check-prefix=ACORE
2
3
; RUN: llc < %s -mtriple=thumb-none-eabi -mcpu=cortex-m4 2>&1 | FileCheck %s --check-prefix=ARM --check-prefix=MCORE
3
4
4
5
define i32 @read_i32_encoded_register () nounwind {
5
- entry:
6
6
; ARM-LABEL: read_i32_encoded_register:
7
- ; ARM: mrc p1, #2, r0, c3, c4, #5
7
+ ; ARM: @ %bb.0: @ %entry
8
+ ; ARM-NEXT: mrc p1, #2, r0, c3, c4, #5
9
+ ; ARM-NEXT: bx lr
10
+ entry:
8
11
%reg = call i32 @llvm.read_register.i32 (metadata !0 )
9
12
ret i32 %reg
10
13
}
11
14
12
15
define i64 @read_i64_encoded_register () nounwind {
13
- entry:
14
16
; ARM-LABEL: read_i64_encoded_register:
15
- ; ARM: mrrc p1, #2, r0, r1, c3
17
+ ; ARM: @ %bb.0: @ %entry
18
+ ; ARM-NEXT: mrrc p1, #2, r0, r1, c3
19
+ ; ARM-NEXT: bx lr
20
+ entry:
16
21
%reg = call i64 @llvm.read_register.i64 (metadata !1 )
17
22
ret i64 %reg
18
23
}
19
24
20
- define i32 @read_apsr () nounwind {
25
+ define i64 @read_volatile_i64_twice () {
26
+ ; ACORE-LABEL: read_volatile_i64_twice:
27
+ ; ACORE: @ %bb.0: @ %entry
28
+ ; ACORE-NEXT: mov r0, #0
29
+ ; ACORE-NEXT: mov r1, #0
30
+ ; ACORE-NEXT: bx lr
31
+ ;
32
+ ; MCORE-LABEL: read_volatile_i64_twice:
33
+ ; MCORE: @ %bb.0: @ %entry
34
+ ; MCORE-NEXT: movs r0, #0
35
+ ; MCORE-NEXT: movs r1, #0
36
+ ; MCORE-NEXT: bx lr
21
37
entry:
38
+ %0 = tail call i64 @llvm.read_volatile_register.i64 (metadata !5 )
39
+ %1 = tail call i64 @llvm.read_volatile_register.i64 (metadata !5 )
40
+ %xor = xor i64 %1 , %0
41
+ ret i64 %xor
42
+ }
43
+
44
+
45
+ define i32 @read_apsr () nounwind {
22
46
; ARM-LABEL: read_apsr:
23
- ; ARM: mrs r0, apsr
47
+ ; ARM: @ %bb.0: @ %entry
48
+ ; ARM-NEXT: mrs r0, apsr
49
+ ; ARM-NEXT: bx lr
50
+ entry:
24
51
%reg = call i32 @llvm.read_register.i32 (metadata !2 )
25
52
ret i32 %reg
26
53
}
27
54
28
55
define i32 @read_fpscr () nounwind {
29
- entry:
30
56
; ARM-LABEL: read_fpscr:
31
- ; ARM: vmrs r0, fpscr
57
+ ; ARM: @ %bb.0: @ %entry
58
+ ; ARM-NEXT: vmrs r0, fpscr
59
+ ; ARM-NEXT: bx lr
60
+ entry:
32
61
%reg = call i32 @llvm.read_register.i32 (metadata !3 )
33
62
ret i32 %reg
34
63
}
35
64
36
65
define void @write_i32_encoded_register (i32 %x ) nounwind {
37
- entry:
38
66
; ARM-LABEL: write_i32_encoded_register:
39
- ; ARM: mcr p1, #2, r0, c3, c4, #5
67
+ ; ARM: @ %bb.0: @ %entry
68
+ ; ARM-NEXT: mcr p1, #2, r0, c3, c4, #5
69
+ ; ARM-NEXT: bx lr
70
+ entry:
40
71
call void @llvm.write_register.i32 (metadata !0 , i32 %x )
41
72
ret void
42
73
}
43
74
44
75
define void @write_i64_encoded_register (i64 %x ) nounwind {
45
- entry:
46
76
; ARM-LABEL: write_i64_encoded_register:
47
- ; ARM: mcrr p1, #2, r0, r1, c3
77
+ ; ARM: @ %bb.0: @ %entry
78
+ ; ARM-NEXT: mcrr p1, #2, r0, r1, c3
79
+ ; ARM-NEXT: bx lr
80
+ entry:
48
81
call void @llvm.write_register.i64 (metadata !1 , i64 %x )
49
82
ret void
50
83
}
51
84
52
85
define void @write_apsr (i32 %x ) nounwind {
86
+ ; ACORE-LABEL: write_apsr:
87
+ ; ACORE: @ %bb.0: @ %entry
88
+ ; ACORE-NEXT: msr APSR_nzcvq, r0
89
+ ; ACORE-NEXT: bx lr
90
+ ;
91
+ ; MCORE-LABEL: write_apsr:
92
+ ; MCORE: @ %bb.0: @ %entry
93
+ ; MCORE-NEXT: msr apsr_nzcvq, r0
94
+ ; MCORE-NEXT: bx lr
53
95
entry:
54
- ; ARM-LABEL: write_apsr:
55
- ; ACORE: msr APSR_nzcvq, r0
56
- ; MCORE: msr apsr_nzcvq, r0
57
96
call void @llvm.write_register.i32 (metadata !4 , i32 %x )
58
97
ret void
59
98
}
60
99
61
100
define void @write_fpscr (i32 %x ) nounwind {
62
- entry:
63
101
; ARM-LABEL: write_fpscr:
64
- ; ARM: vmsr fpscr, r0
102
+ ; ARM: @ %bb.0: @ %entry
103
+ ; ARM-NEXT: vmsr fpscr, r0
104
+ ; ARM-NEXT: bx lr
105
+ entry:
65
106
call void @llvm.write_register.i32 (metadata !3 , i32 %x )
66
107
ret void
67
108
}
@@ -76,3 +117,4 @@ declare void @llvm.write_register.i64(metadata, i64) nounwind
76
117
!2 = !{!"apsr" }
77
118
!3 = !{!"fpscr" }
78
119
!4 = !{!"apsr_nzcvq" }
120
+ !5 = !{!"cp15:1:c14" }
0 commit comments