1//===- llvm/unittest/ADT/FloatingPointMode.cpp ----------------------------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "llvm/ADT/FloatingPointMode.h"
10#include "gtest/gtest.h"
11
12using namespace llvm;
13
14namespace {
15
16TEST(FloatingPointModeTest, ParseDenormalFPAttributeComponent) {
17 EXPECT_EQ(DenormalMode::IEEE, parseDenormalFPAttributeComponent("ieee"));
18 EXPECT_EQ(DenormalMode::IEEE, parseDenormalFPAttributeComponent(""));
19 EXPECT_EQ(DenormalMode::PreserveSign,
20 parseDenormalFPAttributeComponent("preserve-sign"));
21 EXPECT_EQ(DenormalMode::PositiveZero,
22 parseDenormalFPAttributeComponent("positive-zero"));
23 EXPECT_EQ(DenormalMode::Dynamic,
24 parseDenormalFPAttributeComponent("dynamic"));
25 EXPECT_EQ(DenormalMode::Invalid, parseDenormalFPAttributeComponent("foo"));
26}
27
28TEST(FloatingPointModeTest, DenormalAttributeName) {
29 EXPECT_EQ("ieee", denormalModeKindName(DenormalMode::IEEE));
30 EXPECT_EQ("preserve-sign", denormalModeKindName(DenormalMode::PreserveSign));
31 EXPECT_EQ("positive-zero", denormalModeKindName(DenormalMode::PositiveZero));
32 EXPECT_EQ("dynamic", denormalModeKindName(DenormalMode::Dynamic));
33 EXPECT_EQ("", denormalModeKindName(DenormalMode::Invalid));
34}
35
36TEST(FloatingPointModeTest, ParseDenormalFPAttribute) {
37 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
38 parseDenormalFPAttribute("ieee"));
39 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
40 parseDenormalFPAttribute("ieee,ieee"));
41 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
42 parseDenormalFPAttribute("ieee,"));
43 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
44 parseDenormalFPAttribute(""));
45 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
46 parseDenormalFPAttribute(","));
47
48 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
49 parseDenormalFPAttribute("preserve-sign"));
50 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
51 parseDenormalFPAttribute("preserve-sign,"));
52 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
53 parseDenormalFPAttribute("preserve-sign,preserve-sign"));
54
55 EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
56 parseDenormalFPAttribute("positive-zero"));
57 EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
58 parseDenormalFPAttribute("positive-zero,positive-zero"));
59
60 EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic),
61 parseDenormalFPAttribute("dynamic"));
62 EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic),
63 parseDenormalFPAttribute("dynamic,dynamic"));
64
65 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PositiveZero),
66 parseDenormalFPAttribute("ieee,positive-zero"));
67 EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::IEEE),
68 parseDenormalFPAttribute("positive-zero,ieee"));
69
70 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE),
71 parseDenormalFPAttribute("preserve-sign,ieee"));
72 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign),
73 parseDenormalFPAttribute("ieee,preserve-sign"));
74
75 EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign),
76 parseDenormalFPAttribute("dynamic,preserve-sign"));
77 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::Dynamic),
78 parseDenormalFPAttribute("preserve-sign,dynamic"));
79
80 EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
81 parseDenormalFPAttribute("foo"));
82 EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
83 parseDenormalFPAttribute("foo,foo"));
84 EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
85 parseDenormalFPAttribute("foo,bar"));
86}
87
88TEST(FloatingPointModeTest, RenderDenormalFPAttribute) {
89 EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
90 parseDenormalFPAttribute("foo"));
91
92 EXPECT_EQ("ieee,ieee",
93 DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).str());
94 EXPECT_EQ(",",
95 DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid).str());
96
97 EXPECT_EQ(
98 "preserve-sign,preserve-sign",
99 DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign).str());
100
101 EXPECT_EQ(
102 "positive-zero,positive-zero",
103 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero).str());
104
105 EXPECT_EQ(
106 "ieee,preserve-sign",
107 DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign).str());
108
109 EXPECT_EQ(
110 "preserve-sign,ieee",
111 DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE).str());
112
113 EXPECT_EQ(
114 "preserve-sign,positive-zero",
115 DenormalMode(DenormalMode::PreserveSign, DenormalMode::PositiveZero).str());
116
117 EXPECT_EQ("dynamic,dynamic",
118 DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic).str());
119 EXPECT_EQ("ieee,dynamic",
120 DenormalMode(DenormalMode::IEEE, DenormalMode::Dynamic).str());
121 EXPECT_EQ("dynamic,ieee",
122 DenormalMode(DenormalMode::Dynamic, DenormalMode::IEEE).str());
123}
124
125TEST(FloatingPointModeTest, DenormalModeIsSimple) {
126 EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isSimple());
127 EXPECT_FALSE(DenormalMode(DenormalMode::IEEE,
128 DenormalMode::Invalid).isSimple());
129 EXPECT_FALSE(DenormalMode(DenormalMode::PreserveSign,
130 DenormalMode::PositiveZero).isSimple());
131 EXPECT_FALSE(DenormalMode(DenormalMode::PreserveSign, DenormalMode::Dynamic)
132 .isSimple());
133 EXPECT_FALSE(DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign)
134 .isSimple());
135}
136
137TEST(FloatingPointModeTest, DenormalModeIsValid) {
138 EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isValid());
139 EXPECT_FALSE(DenormalMode(DenormalMode::IEEE, DenormalMode::Invalid).isValid());
140 EXPECT_FALSE(DenormalMode(DenormalMode::Invalid, DenormalMode::IEEE).isValid());
141 EXPECT_FALSE(DenormalMode(DenormalMode::Invalid,
142 DenormalMode::Invalid).isValid());
143}
144
145TEST(FloatingPointModeTest, DenormalModeConstructor) {
146 EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
147 DenormalMode::getInvalid());
148 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
149 DenormalMode::getIEEE());
150 EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getDefault());
151 EXPECT_EQ(DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic),
152 DenormalMode::getDynamic());
153 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
154 DenormalMode::getPreserveSign());
155 EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
156 DenormalMode::getPositiveZero());
157}
158
159TEST(FloatingPointModeTest, DenormalModeMerge) {
160 EXPECT_EQ(
161 DenormalMode::getInvalid(),
162 DenormalMode::getInvalid().mergeCalleeMode(DenormalMode::getInvalid()));
163 EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getInvalid().mergeCalleeMode(
164 DenormalMode::getIEEE()));
165 EXPECT_EQ(DenormalMode::getInvalid(), DenormalMode::getIEEE().mergeCalleeMode(
166 DenormalMode::getInvalid()));
167
168 EXPECT_EQ(DenormalMode::getIEEE(), DenormalMode::getIEEE().mergeCalleeMode(
169 DenormalMode::getDynamic()));
170 EXPECT_EQ(DenormalMode::getPreserveSign(),
171 DenormalMode::getPreserveSign().mergeCalleeMode(
172 DenormalMode::getDynamic()));
173 EXPECT_EQ(DenormalMode::getPositiveZero(),
174 DenormalMode::getPositiveZero().mergeCalleeMode(
175 DenormalMode::getDynamic()));
176 EXPECT_EQ(
177 DenormalMode::getDynamic(),
178 DenormalMode::getDynamic().mergeCalleeMode(DenormalMode::getDynamic()));
179
180 EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign),
181 DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign)
182 .mergeCalleeMode(
183 DenormalMode(DenormalMode::IEEE, DenormalMode::Dynamic)));
184
185 EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE),
186 DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE)
187 .mergeCalleeMode(
188 DenormalMode(DenormalMode::Dynamic, DenormalMode::IEEE)));
189
190 EXPECT_EQ(
191 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign),
192 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign)
193 .mergeCalleeMode(
194 DenormalMode(DenormalMode::Dynamic, DenormalMode::Dynamic)));
195
196 EXPECT_EQ(
197 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign),
198 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign)
199 .mergeCalleeMode(
200 DenormalMode(DenormalMode::PositiveZero, DenormalMode::Dynamic)));
201
202 EXPECT_EQ(
203 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign),
204 DenormalMode(DenormalMode::PositiveZero, DenormalMode::PreserveSign)
205 .mergeCalleeMode(
206 DenormalMode(DenormalMode::Dynamic, DenormalMode::PreserveSign)));
207
208 // Test some invalid / undefined behavior cases
209 EXPECT_EQ(
210 DenormalMode::getPreserveSign(),
211 DenormalMode::getIEEE().mergeCalleeMode(DenormalMode::getPreserveSign()));
212 EXPECT_EQ(
213 DenormalMode::getPreserveSign(),
214 DenormalMode::getIEEE().mergeCalleeMode(DenormalMode::getPreserveSign()));
215 EXPECT_EQ(
216 DenormalMode::getIEEE(),
217 DenormalMode::getPreserveSign().mergeCalleeMode(DenormalMode::getIEEE()));
218 EXPECT_EQ(
219 DenormalMode::getIEEE(),
220 DenormalMode::getPreserveSign().mergeCalleeMode(DenormalMode::getIEEE()));
221}
222
223TEST(FloatingPointModeTest, DenormalModePredicates) {
224 EXPECT_TRUE(DenormalMode::getPreserveSign().inputsAreZero());
225 EXPECT_TRUE(DenormalMode::getPositiveZero().inputsAreZero());
226 EXPECT_FALSE(DenormalMode::getIEEE().inputsAreZero());
227 EXPECT_FALSE(DenormalMode::getDynamic().inputsAreZero());
228}
229}
230

source code of llvm/unittests/ADT/FloatingPointMode.cpp