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 
12 using namespace llvm;
13 
14 namespace {
15 
TEST(FloatingPointModeTest,ParseDenormalFPAttributeComponent)16 TEST(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::Invalid, parseDenormalFPAttributeComponent("foo"));
24 }
25 
TEST(FloatingPointModeTest,DenormalAttributeName)26 TEST(FloatingPointModeTest, DenormalAttributeName) {
27   EXPECT_EQ("ieee", denormalModeKindName(DenormalMode::IEEE));
28   EXPECT_EQ("preserve-sign", denormalModeKindName(DenormalMode::PreserveSign));
29   EXPECT_EQ("positive-zero", denormalModeKindName(DenormalMode::PositiveZero));
30   EXPECT_EQ("", denormalModeKindName(DenormalMode::Invalid));
31 }
32 
TEST(FloatingPointModeTest,ParseDenormalFPAttribute)33 TEST(FloatingPointModeTest, ParseDenormalFPAttribute) {
34   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
35             parseDenormalFPAttribute("ieee"));
36   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
37             parseDenormalFPAttribute("ieee,ieee"));
38   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
39             parseDenormalFPAttribute("ieee,"));
40   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
41             parseDenormalFPAttribute(""));
42   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
43             parseDenormalFPAttribute(","));
44 
45   EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
46             parseDenormalFPAttribute("preserve-sign"));
47   EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
48             parseDenormalFPAttribute("preserve-sign,"));
49   EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
50             parseDenormalFPAttribute("preserve-sign,preserve-sign"));
51 
52   EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
53             parseDenormalFPAttribute("positive-zero"));
54   EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
55             parseDenormalFPAttribute("positive-zero,positive-zero"));
56 
57 
58   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PositiveZero),
59             parseDenormalFPAttribute("ieee,positive-zero"));
60   EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::IEEE),
61             parseDenormalFPAttribute("positive-zero,ieee"));
62 
63   EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE),
64             parseDenormalFPAttribute("preserve-sign,ieee"));
65   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign),
66             parseDenormalFPAttribute("ieee,preserve-sign"));
67 
68 
69   EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
70             parseDenormalFPAttribute("foo"));
71   EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
72             parseDenormalFPAttribute("foo,foo"));
73   EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
74             parseDenormalFPAttribute("foo,bar"));
75 }
76 
TEST(FloatingPointModeTest,RenderDenormalFPAttribute)77 TEST(FloatingPointModeTest, RenderDenormalFPAttribute) {
78   EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
79             parseDenormalFPAttribute("foo"));
80 
81   EXPECT_EQ("ieee,ieee",
82             DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).str());
83   EXPECT_EQ(",",
84             DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid).str());
85 
86   EXPECT_EQ(
87     "preserve-sign,preserve-sign",
88     DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign).str());
89 
90   EXPECT_EQ(
91     "positive-zero,positive-zero",
92     DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero).str());
93 
94   EXPECT_EQ(
95     "ieee,preserve-sign",
96     DenormalMode(DenormalMode::IEEE, DenormalMode::PreserveSign).str());
97 
98   EXPECT_EQ(
99     "preserve-sign,ieee",
100     DenormalMode(DenormalMode::PreserveSign, DenormalMode::IEEE).str());
101 
102   EXPECT_EQ(
103     "preserve-sign,positive-zero",
104     DenormalMode(DenormalMode::PreserveSign, DenormalMode::PositiveZero).str());
105 }
106 
TEST(FloatingPointModeTest,DenormalModeIsSimple)107 TEST(FloatingPointModeTest, DenormalModeIsSimple) {
108   EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isSimple());
109   EXPECT_FALSE(DenormalMode(DenormalMode::IEEE,
110                             DenormalMode::Invalid).isSimple());
111   EXPECT_FALSE(DenormalMode(DenormalMode::PreserveSign,
112                             DenormalMode::PositiveZero).isSimple());
113 }
114 
TEST(FloatingPointModeTest,DenormalModeIsValid)115 TEST(FloatingPointModeTest, DenormalModeIsValid) {
116   EXPECT_TRUE(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE).isValid());
117   EXPECT_FALSE(DenormalMode(DenormalMode::IEEE, DenormalMode::Invalid).isValid());
118   EXPECT_FALSE(DenormalMode(DenormalMode::Invalid, DenormalMode::IEEE).isValid());
119   EXPECT_FALSE(DenormalMode(DenormalMode::Invalid,
120                             DenormalMode::Invalid).isValid());
121 }
122 
TEST(FloatingPointModeTest,DenormalModeConstructor)123 TEST(FloatingPointModeTest, DenormalModeConstructor) {
124   EXPECT_EQ(DenormalMode(DenormalMode::Invalid, DenormalMode::Invalid),
125             DenormalMode::getInvalid());
126   EXPECT_EQ(DenormalMode(DenormalMode::IEEE, DenormalMode::IEEE),
127             DenormalMode::getIEEE());
128   EXPECT_EQ(DenormalMode(DenormalMode::PreserveSign, DenormalMode::PreserveSign),
129             DenormalMode::getPreserveSign());
130   EXPECT_EQ(DenormalMode(DenormalMode::PositiveZero, DenormalMode::PositiveZero),
131             DenormalMode::getPositiveZero());
132 }
133 
134 }
135