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