Skip to content

Commit 3a9ac7c

Browse files
committed
[ARM] Add various strictfp tests
1 parent b203c39 commit 3a9ac7c

File tree

3 files changed

+413
-0
lines changed

3 files changed

+413
-0
lines changed
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
; RUN: llc -mtriple arm-- -mattr=+vfp4 -stop-after=finalize-isel %s -o - | FileCheck %s
2+
3+
define float @func_02(float %x, float %y) strictfp nounwind {
4+
%call = call float @func_01(float %x) strictfp
5+
%res = call float @llvm.experimental.constrained.fadd.f32(float %call, float %y, metadata !"round.dynamic", metadata !"fpexcept.ignore") strictfp
6+
ret float %res
7+
}
8+
; CHECK-LABEL: func_02
9+
; CHECK: BL @func_01, {{.*}}, implicit-def $fpscr
10+
11+
12+
declare float @func_01(float)
13+
declare float @llvm.experimental.constrained.fadd.f32(float, float, metadata, metadata)
14+
Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,145 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple arm-- -mattr=+vfp4 -O0 -o - %s | FileCheck %s
3+
; RUN: llc -mtriple arm-- -mattr=+vfp4 -O3 -o - %s | FileCheck %s --check-prefix=SUBOPTIMAL
4+
5+
6+
declare float @llvm.experimental.constrained.sitofp.f32.i32(i32, metadata, metadata)
7+
declare float @llvm.experimental.constrained.sitofp.f32.i16(i16, metadata, metadata)
8+
declare i1 @llvm.experimental.constrained.fcmp.f32(float, float, metadata, metadata)
9+
declare float @llvm.experimental.constrained.uitofp.f32.i16(i16, metadata, metadata)
10+
11+
define i32 @test() #0 {
12+
; CHECK-LABEL: test:
13+
; CHECK: @ %bb.0: @ %entry
14+
; CHECK-NEXT: sub sp, sp, #8
15+
; CHECK-NEXT: mov r0, #53477376
16+
; CHECK-NEXT: orr r0, r0, #1073741824
17+
; CHECK-NEXT: str r0, [sp, #4]
18+
; CHECK-NEXT: mov r0, #-2147483647
19+
; CHECK-NEXT: str r0, [sp]
20+
; CHECK-NEXT: vldr d16, [sp]
21+
; CHECK-NEXT: vldr d17, .LCPI0_0
22+
; CHECK-NEXT: vsub.f64 d16, d16, d17
23+
; CHECK-NEXT: vcvt.f32.f64 s0, d16
24+
; CHECK-NEXT: vcmp.f32 s0, s0
25+
; CHECK-NEXT: vmrs APSR_nzcv, fpscr
26+
; CHECK-NEXT: mov r0, #0
27+
; CHECK-NEXT: moveq r0, #1
28+
; CHECK-NEXT: add sp, sp, #8
29+
; CHECK-NEXT: mov pc, lr
30+
; CHECK-NEXT: .p2align 3
31+
; CHECK-NEXT: @ %bb.1:
32+
; CHECK-NEXT: .LCPI0_0:
33+
; CHECK-NEXT: .long 2147483648 @ double 4503601774854144
34+
; CHECK-NEXT: .long 1127219200
35+
;
36+
; SUBOPTIMAL-LABEL: test:
37+
; SUBOPTIMAL: @ %bb.0: @ %entry
38+
; SUBOPTIMAL-NEXT: sub sp, sp, #8
39+
; SUBOPTIMAL-NEXT: mov r0, #53477376
40+
; SUBOPTIMAL-NEXT: orr r0, r0, #1073741824
41+
; SUBOPTIMAL-NEXT: str r0, [sp, #4]
42+
; SUBOPTIMAL-NEXT: mov r0, #-2147483647
43+
; SUBOPTIMAL-NEXT: str r0, [sp]
44+
; SUBOPTIMAL-NEXT: vldr d16, [sp]
45+
; SUBOPTIMAL-NEXT: vldr d17, .LCPI0_0
46+
; SUBOPTIMAL-NEXT: vsub.f64 d16, d16, d17
47+
; SUBOPTIMAL-NEXT: vcvt.f32.f64 s0, d16
48+
; SUBOPTIMAL-NEXT: vcmp.f32 s0, s0
49+
; SUBOPTIMAL-NEXT: vmrs APSR_nzcv, fpscr
50+
; SUBOPTIMAL-NEXT: mov r0, #0
51+
; SUBOPTIMAL-NEXT: moveq r0, #1
52+
; SUBOPTIMAL-NEXT: add sp, sp, #8
53+
; SUBOPTIMAL-NEXT: mov pc, lr
54+
; SUBOPTIMAL-NEXT: .p2align 3
55+
; SUBOPTIMAL-NEXT: @ %bb.1:
56+
; SUBOPTIMAL-NEXT: .LCPI0_0:
57+
; SUBOPTIMAL-NEXT: .long 2147483648 @ double 4503601774854144
58+
; SUBOPTIMAL-NEXT: .long 1127219200
59+
entry:
60+
%conv = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 1, metadata !"round.tonearest", metadata !"fpexcept.strict") #1
61+
%conv1 = call float @llvm.experimental.constrained.sitofp.f32.i16(i16 1, metadata !"round.tonearest", metadata !"fpexcept.strict") #1
62+
%cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %conv, float %conv1, metadata !"oeq", metadata !"fpexcept.strict") #1
63+
%conv2 = zext i1 %cmp to i32
64+
ret i32 %conv2
65+
}
66+
67+
define i32 @test2() #0 {
68+
; CHECK-LABEL: test2:
69+
; CHECK: @ %bb.0: @ %entry
70+
; CHECK-NEXT: sub sp, sp, #16
71+
; CHECK-NEXT: mov r0, #53477376
72+
; CHECK-NEXT: orr r0, r0, #1073741824
73+
; CHECK-NEXT: str r0, [sp, #12]
74+
; CHECK-NEXT: mov r1, #-2147483647
75+
; CHECK-NEXT: str r1, [sp, #8]
76+
; CHECK-NEXT: vldr d16, [sp, #8]
77+
; CHECK-NEXT: vldr d17, .LCPI1_0
78+
; CHECK-NEXT: vsub.f64 d16, d16, d17
79+
; CHECK-NEXT: vcvt.f32.f64 s0, d16
80+
; CHECK-NEXT: str r0, [sp, #4]
81+
; CHECK-NEXT: mov r0, #1
82+
; CHECK-NEXT: str r0, [sp]
83+
; CHECK-NEXT: vldr d16, [sp]
84+
; CHECK-NEXT: vldr d17, .LCPI1_1
85+
; CHECK-NEXT: vsub.f64 d16, d16, d17
86+
; CHECK-NEXT: vcvt.f32.f64 s2, d16
87+
; CHECK-NEXT: vcmp.f32 s0, s2
88+
; CHECK-NEXT: vmrs APSR_nzcv, fpscr
89+
; CHECK-NEXT: mov r0, #0
90+
; CHECK-NEXT: moveq r0, #1
91+
; CHECK-NEXT: add sp, sp, #16
92+
; CHECK-NEXT: mov pc, lr
93+
; CHECK-NEXT: .p2align 3
94+
; CHECK-NEXT: @ %bb.1:
95+
; CHECK-NEXT: .LCPI1_0:
96+
; CHECK-NEXT: .long 2147483648 @ double 4503601774854144
97+
; CHECK-NEXT: .long 1127219200
98+
; CHECK-NEXT: .LCPI1_1:
99+
; CHECK-NEXT: .long 0 @ double 4503599627370496
100+
; CHECK-NEXT: .long 1127219200
101+
;
102+
; SUBOPTIMAL-LABEL: test2:
103+
; SUBOPTIMAL: @ %bb.0: @ %entry
104+
; SUBOPTIMAL-NEXT: sub sp, sp, #16
105+
; SUBOPTIMAL-NEXT: mov r0, #53477376
106+
; SUBOPTIMAL-NEXT: orr r0, r0, #1073741824
107+
; SUBOPTIMAL-NEXT: str r0, [sp, #12]
108+
; SUBOPTIMAL-NEXT: mov r1, #-2147483647
109+
; SUBOPTIMAL-NEXT: str r1, [sp, #8]
110+
; SUBOPTIMAL-NEXT: vldr d16, [sp, #8]
111+
; SUBOPTIMAL-NEXT: vldr d17, .LCPI1_0
112+
; SUBOPTIMAL-NEXT: vsub.f64 d16, d16, d17
113+
; SUBOPTIMAL-NEXT: vcvt.f32.f64 s0, d16
114+
; SUBOPTIMAL-NEXT: str r0, [sp, #4]
115+
; SUBOPTIMAL-NEXT: mov r0, #1
116+
; SUBOPTIMAL-NEXT: str r0, [sp]
117+
; SUBOPTIMAL-NEXT: vldr d16, [sp]
118+
; SUBOPTIMAL-NEXT: vldr d17, .LCPI1_1
119+
; SUBOPTIMAL-NEXT: vsub.f64 d16, d16, d17
120+
; SUBOPTIMAL-NEXT: vcvt.f32.f64 s2, d16
121+
; SUBOPTIMAL-NEXT: vcmp.f32 s0, s2
122+
; SUBOPTIMAL-NEXT: vmrs APSR_nzcv, fpscr
123+
; SUBOPTIMAL-NEXT: mov r0, #0
124+
; SUBOPTIMAL-NEXT: moveq r0, #1
125+
; SUBOPTIMAL-NEXT: add sp, sp, #16
126+
; SUBOPTIMAL-NEXT: mov pc, lr
127+
; SUBOPTIMAL-NEXT: .p2align 3
128+
; SUBOPTIMAL-NEXT: @ %bb.1:
129+
; SUBOPTIMAL-NEXT: .LCPI1_0:
130+
; SUBOPTIMAL-NEXT: .long 2147483648 @ double 4503601774854144
131+
; SUBOPTIMAL-NEXT: .long 1127219200
132+
; SUBOPTIMAL-NEXT: .LCPI1_1:
133+
; SUBOPTIMAL-NEXT: .long 0 @ double 4503599627370496
134+
; SUBOPTIMAL-NEXT: .long 1127219200
135+
entry:
136+
%conv = call float @llvm.experimental.constrained.sitofp.f32.i32(i32 1, metadata !"round.tonearest", metadata !"fpexcept.strict") #1
137+
%conv1 = call float @llvm.experimental.constrained.uitofp.f32.i16(i16 1, metadata !"round.tonearest", metadata !"fpexcept.strict") #1
138+
%cmp = call i1 @llvm.experimental.constrained.fcmp.f32(float %conv, float %conv1, metadata !"oeq", metadata !"fpexcept.strict") #1
139+
%conv2 = zext i1 %cmp to i32
140+
ret i32 %conv2
141+
}
142+
143+
attributes #0 = { strictfp noinline optnone }
144+
attributes #1 = { strictfp }
145+

0 commit comments

Comments
 (0)