@@ -17,7 +17,7 @@ Rounding TargetCharacteristics::defaultRounding;
1717
1818TargetCharacteristics::TargetCharacteristics () {
1919 auto enableCategoryKinds{[this ](TypeCategory category) {
20- for (int kind{0 }; kind < maxKind; ++kind) {
20+ for (int kind{1 }; kind <= maxKind; ++kind) {
2121 if (CanSupportType (category, kind)) {
2222 auto byteSize{static_cast <std::size_t >(kind)};
2323 if (category == TypeCategory::Real ||
@@ -70,14 +70,14 @@ bool TargetCharacteristics::EnableType(common::TypeCategory category,
7070
7171void TargetCharacteristics::DisableType (
7272 common::TypeCategory category, std::int64_t kind) {
73- if (kind >= 0 && kind < maxKind) {
73+ if (kind > 0 && kind <= maxKind) {
7474 align_[static_cast <int >(category)][kind] = 0 ;
7575 }
7676}
7777
7878std::size_t TargetCharacteristics::GetByteSize (
7979 common::TypeCategory category, std::int64_t kind) const {
80- if (kind >= 0 && kind < maxKind) {
80+ if (kind > 0 && kind <= maxKind) {
8181 return byteSize_[static_cast <int >(category)][kind];
8282 } else {
8383 return 0 ;
@@ -86,7 +86,7 @@ std::size_t TargetCharacteristics::GetByteSize(
8686
8787std::size_t TargetCharacteristics::GetAlignment (
8888 common::TypeCategory category, std::int64_t kind) const {
89- if (kind >= 0 && kind < maxKind) {
89+ if (kind > 0 && kind <= maxKind) {
9090 return align_[static_cast <int >(category)][kind];
9191 } else {
9292 return 0 ;
@@ -108,6 +108,33 @@ void TargetCharacteristics::set_areSubnormalsFlushedToZero(bool yes) {
108108 areSubnormalsFlushedToZero_ = yes;
109109}
110110
111+ // Check if the target has subnormal flushing control for:
112+ // - a given real kind (kind != 0)
113+ // - any real kind (kind == 0 && any == true)
114+ // - all real kinds (kind == 0 && any == false)
115+ bool TargetCharacteristics::hasSubnormalFlushingControl (
116+ int kind, bool any) const {
117+ CHECK (kind >= 0 && kind <= maxKind);
118+ if (kind == 0 ) {
119+ for (int kind{1 }; kind <= maxKind; ++kind) {
120+ if (CanSupportType (TypeCategory::Real, kind) &&
121+ hasSubnormalFlushingControl_[kind] == any) {
122+ return any;
123+ }
124+ }
125+ return !any;
126+ } else {
127+ CHECK (CanSupportType (TypeCategory::Real, kind));
128+ return hasSubnormalFlushingControl_[kind];
129+ }
130+ }
131+
132+ void TargetCharacteristics::set_hasSubnormalFlushingControl (
133+ int kind, bool yes) {
134+ CHECK (kind > 0 && kind <= maxKind);
135+ hasSubnormalFlushingControl_[kind] = yes;
136+ }
137+
111138void TargetCharacteristics::set_roundingMode (Rounding rounding) {
112139 roundingMode_ = rounding;
113140}
0 commit comments