@@ -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,30 @@ void TargetCharacteristics::set_areSubnormalsFlushedToZero(bool yes) {
108108 areSubnormalsFlushedToZero_ = yes;
109109}
110110
111+ // Check if a given real kind has flushing control.
112+ bool TargetCharacteristics::hasSubnormalFlushingControl (int kind) const {
113+ CHECK (kind > 0 && kind <= maxKind);
114+ CHECK (CanSupportType (TypeCategory::Real, kind));
115+ return hasSubnormalFlushingControl_[kind];
116+ }
117+
118+ // Check if any or all real kinds have flushing control.
119+ bool TargetCharacteristics::hasSubnormalFlushingControl (bool any) const {
120+ for (int kind{1 }; kind <= maxKind; ++kind) {
121+ if (CanSupportType (TypeCategory::Real, kind) &&
122+ hasSubnormalFlushingControl_[kind] == any) {
123+ return any;
124+ }
125+ }
126+ return !any;
127+ }
128+
129+ void TargetCharacteristics::set_hasSubnormalFlushingControl (
130+ int kind, bool yes) {
131+ CHECK (kind > 0 && kind <= maxKind);
132+ hasSubnormalFlushingControl_[kind] = yes;
133+ }
134+
111135void TargetCharacteristics::set_roundingMode (Rounding rounding) {
112136 roundingMode_ = rounding;
113137}
0 commit comments