230 lines · cpp
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-exception6//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 cases209 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