1
1
; RUN: llc < %s -mcpu=generic -mtriple=x86_64-linux | FileCheck %s
2
2
3
+ @flags_gv = global i64 0
4
+
3
5
; First without noredzone.
4
6
; CHECK-LABEL: f0:
5
7
; CHECK: -4(%rsp)
6
8
; CHECK: -4(%rsp)
7
9
; CHECK: ret
8
- define x86_fp80 @f0 (float %f ) nounwind readnone {
10
+ define x86_fp80 @f0 (float %f ) nounwind {
9
11
entry:
10
12
%0 = fpext float %f to x86_fp80 ; <x86_fp80> [#uses=1]
11
13
ret x86_fp80 %0
@@ -18,8 +20,42 @@ entry:
18
20
; CHECK: (%rsp)
19
21
; CHECK: addq $4, %rsp
20
22
; CHECK: ret
21
- define x86_fp80 @f1 (float %f ) nounwind readnone noredzone {
23
+ define x86_fp80 @f1 (float %f ) nounwind noredzone {
22
24
entry:
23
25
%0 = fpext float %f to x86_fp80 ; <x86_fp80> [#uses=1]
24
26
ret x86_fp80 %0
25
27
}
28
+
29
+ declare i64 @llvm.x86.flags.read.u64 ()
30
+ declare void @llvm.x86.flags.write.u64 (i64 )
31
+
32
+
33
+ ; pushfq and popfq prevent redzones.
34
+ ; CHECK-LABEL: norz_flags_read:
35
+ ; CHECK: subq ${{[0-9]+}}, %rsp
36
+ ; CHECK: pushfq
37
+ ; CHECK: popq
38
+ ; CHECK: (%rsp)
39
+ ; CHECK: (%rsp)
40
+ ; CHECK: ret
41
+ define x86_fp80 @norz_flags_read (float %f ) nounwind {
42
+ entry:
43
+ %flags = call i64 @llvm.x86.flags.read.u64 ()
44
+ store i64 %flags , i64* @flags_gv
45
+ %0 = fpext float %f to x86_fp80
46
+ ret x86_fp80 %0
47
+ }
48
+
49
+ ; CHECK-LABEL: norz_flags_write:
50
+ ; CHECK: subq ${{[0-9]+}}, %rsp
51
+ ; CHECK: pushq
52
+ ; CHECK: popfq
53
+ ; CHECK: (%rsp)
54
+ ; CHECK: (%rsp)
55
+ ; CHECK: ret
56
+ define x86_fp80 @norz_flags_write (float %f , i64 %flags ) nounwind {
57
+ entry:
58
+ call void @llvm.x86.flags.write.u64 (i64 %flags )
59
+ %0 = fpext float %f to x86_fp80
60
+ ret x86_fp80 %0
61
+ }
0 commit comments