brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.3 KiB · b875076 Raw
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