Skip to content

Commit d11e406

Browse files
committed
[flang] Make real type of kind 10 target dependent
The real(10) is supported on x86_64. On aarch64, the value of selected_real_kind(16) should be 16 rather than 10 since real(10) is not supported on x86_64. Previously, the real type support check is not target dependent. Support it now through the target triple information. Reviewed By: clementval Differential Revision: https://reviews.llvm.org/D134021
1 parent aef03c9 commit d11e406

File tree

11 files changed

+213
-36
lines changed

11 files changed

+213
-36
lines changed

flang/lib/Evaluate/target.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ namespace Fortran::evaluate {
1616
Rounding TargetCharacteristics::defaultRounding;
1717

1818
TargetCharacteristics::TargetCharacteristics() {
19-
// TODO: Fill in the type information from command-line targeting information.
2019
auto enableCategoryKinds{[this](TypeCategory category) {
2120
for (int kind{0}; kind < maxKind; ++kind) {
2221
if (CanSupportType(category, kind)) {

flang/lib/Frontend/CompilerInvocation.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -826,6 +826,14 @@ void CompilerInvocation::setSemanticsOpts(
826826
.set_warnOnNonstandardUsage(getEnableConformanceChecks())
827827
.set_warningsAreErrors(getWarnAsErr())
828828
.set_moduleFileSuffix(getModuleFileSuffix());
829+
830+
llvm::Triple targetTriple{llvm::Triple(this->targetOpts.triple)};
831+
// FIXME: Handle real(3) ?
832+
if (targetTriple.getArch() != llvm::Triple::ArchType::x86 &&
833+
targetTriple.getArch() != llvm::Triple::ArchType::x86_64) {
834+
semanticsContext->targetCharacteristics().DisableType(
835+
Fortran::common::TypeCategory::Real, /*kind=*/10);
836+
}
829837
}
830838

831839
/// Set \p loweringOptions controlling lowering behavior based

flang/module/__fortran_ieee_exceptions.f90

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,15 +43,25 @@
4343
! Define specifics with 1 LOGICAL or REAL argument for generic G.
4444
#define SPECIFICS_L(G) \
4545
G(1) G(2) G(4) G(8)
46+
#if __x86_64__
4647
#define SPECIFICS_R(G) \
4748
G(2) G(3) G(4) G(8) G(10) G(16)
49+
#else
50+
#define SPECIFICS_R(G) \
51+
G(2) G(3) G(4) G(8) G(16)
52+
#endif
4853

4954
! Set PRIVATE accessibility for specifics with 1 LOGICAL or REAL argument for
5055
! generic G.
5156
#define PRIVATE_L(G) private :: \
5257
G##_l1, G##_l2, G##_l4, G##_l8
58+
#if __x86_64__
5359
#define PRIVATE_R(G) private :: \
5460
G##_a2, G##_a3, G##_a4, G##_a8, G##_a10, G##_a16
61+
#else
62+
#define PRIVATE_R(G) private :: \
63+
G##_a2, G##_a3, G##_a4, G##_a8, G##_a16
64+
#endif
5565

5666
interface ieee_get_flag
5767
elemental subroutine ieee_get_flag_0(flag, flag_value)

flang/module/ieee_arithmetic.f90

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,57 +99,104 @@ end function ieee_round_ne
9999
G(1) G(2) G(4) G(8) G(16)
100100
#define SPECIFICS_L(G) \
101101
G(1) G(2) G(4) G(8)
102+
#if __x86_64__
102103
#define SPECIFICS_R(G) \
103104
G(2) G(3) G(4) G(8) G(10) G(16)
105+
#else
106+
#define SPECIFICS_R(G) \
107+
G(2) G(3) G(4) G(8) G(16)
108+
#endif
104109
#define SPECIFICS_II(G) \
105110
G(1,1) G(1,2) G(1,4) G(1,8) G(1,16) \
106111
G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
107112
G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
108113
G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
109114
G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
115+
#if __x86_64__
110116
#define SPECIFICS_RI(G) \
111117
G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
112118
G(3,1) G(3,2) G(3,4) G(3,8) G(3,16) \
113119
G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
114120
G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
115121
G(10,1) G(10,2) G(10,4) G(10,8) G(10,16) \
116122
G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
123+
#else
124+
#define SPECIFICS_RI(G) \
125+
G(2,1) G(2,2) G(2,4) G(2,8) G(2,16) \
126+
G(3,1) G(3,2) G(3,4) G(3,8) G(3,16) \
127+
G(4,1) G(4,2) G(4,4) G(4,8) G(4,16) \
128+
G(8,1) G(8,2) G(8,4) G(8,8) G(8,16) \
129+
G(16,1) G(16,2) G(16,4) G(16,8) G(16,16)
130+
#endif
131+
132+
#if __x86_64__
117133
#define SPECIFICS_RR(G) \
118134
G(2,2) G(2,3) G(2,4) G(2,8) G(2,10) G(2,16) \
119135
G(3,2) G(3,3) G(3,4) G(3,8) G(3,10) G(3,16) \
120136
G(4,2) G(4,3) G(4,4) G(4,8) G(4,10) G(4,16) \
121137
G(8,2) G(8,3) G(8,4) G(8,8) G(8,10) G(8,16) \
122138
G(10,2) G(10,3) G(10,4) G(10,8) G(10,10) G(10,16) \
123139
G(16,2) G(16,3) G(16,4) G(16,8) G(16,10) G(16,16)
140+
#else
141+
#define SPECIFICS_RR(G) \
142+
G(2,2) G(2,3) G(2,4) G(2,8) G(2,16) \
143+
G(3,2) G(3,3) G(3,4) G(3,8) G(3,16) \
144+
G(4,2) G(4,3) G(4,4) G(4,8) G(4,16) \
145+
G(8,2) G(8,3) G(8,4) G(8,8) G(8,16) \
146+
G(16,2) G(16,3) G(16,4) G(16,8) G(16,16)
147+
#endif
124148

125149
! Set PRIVATE accessibility for specifics with 1 or 2 INTEGER, LOGICAL, or REAL
126150
! arguments for generic G.
127151
#define PRIVATE_I(G) private :: \
128152
G##_i1, G##_i2, G##_i4, G##_i8, G##_i16
129153
#define PRIVATE_L(G) private :: \
130154
G##_l1, G##_l2, G##_l4, G##_l8
155+
#if __x86_64__
131156
#define PRIVATE_R(G) private :: \
132157
G##_a2, G##_a3, G##_a4, G##_a8, G##_a10, G##_a16
158+
#else
159+
#define PRIVATE_R(G) private :: \
160+
G##_a2, G##_a3, G##_a4, G##_a8, G##_a16
161+
#endif
133162
#define PRIVATE_II(G) private :: \
134163
G##_i1_i1, G##_i1_i2, G##_i1_i4, G##_i1_i8, G##_i1_i16, \
135164
G##_i2_i1, G##_i2_i2, G##_i2_i4, G##_i2_i8, G##_i2_i16, \
136165
G##_i4_i1, G##_i4_i2, G##_i4_i4, G##_i4_i8, G##_i4_i16, \
137166
G##_i8_i1, G##_i8_i2, G##_i8_i4, G##_i8_i8, G##_i8_i16, \
138167
G##_i16_i1, G##_i16_i2, G##_i16_i4, G##_i16_i8, G##_i16_i16
168+
#if __x86_64__
139169
#define PRIVATE_RI(G) private :: \
140170
G##_a2_i1, G##_a2_i2, G##_a2_i4, G##_a2_i8, G##_a2_i16, \
141171
G##_a3_i1, G##_a3_i2, G##_a3_i4, G##_a3_i8, G##_a3_i16, \
142172
G##_a4_i1, G##_a4_i2, G##_a4_i4, G##_a4_i8, G##_a4_i16, \
143173
G##_a8_i1, G##_a8_i2, G##_a8_i4, G##_a8_i8, G##_a8_i16, \
144174
G##_a10_i1, G##_a10_i2, G##_a10_i4, G##_a10_i8, G##_a10_i16, \
145175
G##_a16_i1, G##_a16_i2, G##_a16_i4, G##_a16_i8, G##_a16_i16
176+
#else
177+
#define PRIVATE_RI(G) private :: \
178+
G##_a2_i1, G##_a2_i2, G##_a2_i4, G##_a2_i8, G##_a2_i16, \
179+
G##_a3_i1, G##_a3_i2, G##_a3_i4, G##_a3_i8, G##_a3_i16, \
180+
G##_a4_i1, G##_a4_i2, G##_a4_i4, G##_a4_i8, G##_a4_i16, \
181+
G##_a8_i1, G##_a8_i2, G##_a8_i4, G##_a8_i8, G##_a8_i16, \
182+
G##_a16_i1, G##_a16_i2, G##_a16_i4, G##_a16_i8, G##_a16_i16
183+
#endif
184+
#if __x86_64__
146185
#define PRIVATE_RR(G) private :: \
147186
G##_a2_a2, G##_a2_a3, G##_a2_a4, G##_a2_a8, G##_a2_a10, G##_a2_a16, \
148187
G##_a3_a2, G##_a3_a3, G##_a3_a4, G##_a3_a8, G##_a3_a10, G##_a3_a16, \
149188
G##_a4_a2, G##_a4_a3, G##_a4_a4, G##_a4_a8, G##_a4_a10, G##_a4_a16, \
150189
G##_a8_a2, G##_a8_a3, G##_a8_a4, G##_a8_a8, G##_a8_a10, G##_a8_a16, \
151190
G##_a10_a2, G##_a10_a3, G##_a10_a4, G##_a10_a8, G##_a10_a10, G##_a10_a16, \
152191
G##_a16_a2, G##_a16_a3, G##_a16_a4, G##_a16_a8, G##_a16_a10, G##_a16_a16
192+
#else
193+
#define PRIVATE_RR(G) private :: \
194+
G##_a2_a2, G##_a2_a3, G##_a2_a4, G##_a2_a8, G##_a2_a16, \
195+
G##_a3_a2, G##_a3_a3, G##_a3_a4, G##_a3_a8, G##_a3_a16, \
196+
G##_a4_a2, G##_a4_a3, G##_a4_a4, G##_a4_a8, G##_a4_a16, \
197+
G##_a8_a2, G##_a8_a3, G##_a8_a4, G##_a8_a8, G##_a8_a16, \
198+
G##_a16_a2, G##_a16_a3, G##_a16_a4, G##_a16_a8, G##_a16_a16
199+
#endif
153200

154201
#define IEEE_CLASS_R(XKIND) \
155202
elemental type(ieee_class_type) function ieee_class_a##XKIND(x); \

flang/test/Evaluate/folding07.f90

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,11 @@ module m
2525
real(8), parameter :: &
2626
eps8 = epsilon(0._8), zeps8 = real(z'3cb0000000000000', kind=8), &
2727
deps8 = 2.2204460492503130808472633361816406250e-16_8
28+
#if __x86_64__
2829
real(10), parameter :: &
2930
eps10 = epsilon(0._10), zeps10 = real(z'3fc08000000000000000', kind=10), &
3031
deps10 = 1.08420217248550443400745280086994171142578125e-19_10
32+
#endif
3133
real(16), parameter :: &
3234
eps16 = epsilon(0._16), &
3335
zeps16 = real(z'3f8f0000000000000000000000000000', kind=16), &
@@ -36,7 +38,9 @@ module m
3638
logical, parameter :: test_eps3 = eps3 == zeps3 .and. eps3 == deps3
3739
logical, parameter :: test_eps4 = eps4 == zeps4 .and. eps4 == deps4
3840
logical, parameter :: test_eps8 = eps8 == zeps8 .and. eps8 == deps8
41+
#if __x86_64__
3942
logical, parameter :: test_eps10 = eps10 == zeps10 .and. eps10 == deps10
43+
#endif
4044
logical, parameter :: test_eps16 = eps16 == zeps16 .and. eps16 == deps16
4145

4246
integer(1), parameter :: &
@@ -73,6 +77,7 @@ module m
7377
&1540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868&
7478
&5084551339423045832369032229481658085593321233482747978262041447231687381771809192998812504040261841&
7579
&24858368e308_8
80+
#if __x86_64__
7681
real(10), parameter :: &
7782
ahuge10 = huge(0._10), zahuge10 = real(z'7ffeffffffffffffffff', kind=10), &
7883
dahuge10 = 1.1897314953572317650212638530309702051690633222946242004403237338917370055229707226164102903365288828&
@@ -125,6 +130,7 @@ module m
125130
&8416350972529537091114317204887747405539054009425375424119317944175137064689643861517718849867010341&
126131
&5325423859110896247108853858086888377772586485641459342621210866475884892600317623459607695088491496&
127132
&6244415660441955208681198977024e4932_10
133+
#endif
128134
real(16), parameter :: &
129135
ahuge16 = huge(0._16), zahuge16 = real(z'7ffeffffffffffffffffffffffffffff', kind=16), &
130136
dahuge16 = 1.1897314953572317650857593266280070161964690526416940455296988842121635797553123923249740128484620735&
@@ -181,20 +187,26 @@ module m
181187
logical, parameter :: test_ahuge3 = ahuge3 == zahuge3 .and. ahuge3 == dahuge3
182188
logical, parameter :: test_ahuge4 = ahuge4 == zahuge4 .and. ahuge4 == dahuge4
183189
logical, parameter :: test_ahuge8 = ahuge8 == zahuge8 .and. ahuge8 == dahuge8
190+
#if __x86_64__
184191
logical, parameter :: test_ahuge10 = ahuge10 == zahuge10 .and. ahuge10 == dahuge10
192+
#endif
185193
logical, parameter :: test_ahuge16 = ahuge16 == zahuge16 .and. ahuge16 == dahuge16
186194

187195
real(2), parameter :: tiny2 = tiny(0._2), ztiny2 = real(z'0400', kind=2)
188196
real(3), parameter :: tiny3 = tiny(0._3), ztiny3 = real(z'0080', kind=3)
189197
real(4), parameter :: tiny4 = tiny(0._4), ztiny4 = real(z'00800000', kind=4)
190198
real(8), parameter :: tiny8 = tiny(0._8), ztiny8 = real(z'0010000000000000', kind=8)
199+
#if __x86_64__
191200
real(10), parameter :: tiny10 = tiny(0._10), ztiny10 = real(z'00018000000000000000', kind=10)
201+
#endif
192202
real(16), parameter :: tiny16 = tiny(0._16), ztiny16 = real(z'00010000000000000000000000000000', kind=16)
193203
logical, parameter :: test_tiny2 = tiny2 == ztiny2
194204
logical, parameter :: test_tiny3 = tiny3 == ztiny3
195205
logical, parameter :: test_tiny4 = tiny4 == ztiny4
196206
logical, parameter :: test_tiny8 = tiny8 == ztiny8
207+
#if __x86_64__
197208
logical, parameter :: test_tiny10 = tiny10 == ztiny10
209+
#endif
198210
logical, parameter :: test_tiny16 = tiny16 == ztiny16
199211

200212
real, parameter :: nan = real(z'7fc12345')
@@ -222,27 +234,35 @@ module m
222234
max3 = maxexponent(0._3), &
223235
max4 = maxexponent(0._4), &
224236
max8 = maxexponent(0._8), &
225-
max10 = maxexponent(0._10), &
226237
max16 = maxexponent(0._16)
238+
#if __x86_64__
239+
integer, parameter :: max10 = maxexponent(0._10)
240+
#endif
227241
logical, parameter :: test_max2 = max2 == 16
228242
logical, parameter :: test_max3 = max3 == 128
229243
logical, parameter :: test_max4 = max4 == 128
230244
logical, parameter :: test_max8 = max8 == 1024
245+
#if __x86_64__
231246
logical, parameter :: test_max10 = max10 == 16384
247+
#endif
232248
logical, parameter :: test_max16 = max16 == 16384
233249

234250
integer, parameter :: &
235251
min2 = minexponent(0._2), &
236252
min3 = minexponent(0._3), &
237253
min4 = minexponent(0._4), &
238254
min8 = minexponent(0._8), &
239-
min10 = minexponent(0._10), &
240255
min16 = minexponent(0._16)
256+
#if __x86_64__
257+
integer, parameter :: min10 = minexponent(0._10)
258+
#endif
241259
logical, parameter :: test_min2 = min2 == -13
242260
logical, parameter :: test_min3 = min3 == -125
243261
logical, parameter :: test_min4 = min4 == -125
244262
logical, parameter :: test_min8 = min8 == -1021
263+
#if __x86_64__
245264
logical, parameter :: test_min10 = min10 == -16381
265+
#endif
246266
logical, parameter :: test_min16 = min16 == -16381
247267

248268
integer, parameter :: &
@@ -262,13 +282,18 @@ module m
262282
arange3 = range(0._3), zrange3 = range((0._3, 0._3)), &
263283
arange4 = range(0._4), zrange4 = range((0._4, 0._4)), &
264284
arange8 = range(0._8), zrange8 = range((0._8, 0._8)), &
265-
arange10 = range(0._10), zrange10 = range((0._10, 0._10)), &
266285
arange16 = range(0._16), zrange16 = range((0._16, 0._16))
286+
#if __x86_64__
287+
integer, parameter :: arange10 = &
288+
range(0._10), zrange10 = range((0._10, 0._10))
289+
#endif
267290
logical, parameter :: test_arange2 = arange2 == 4 .and. zrange2 == 4
268291
logical, parameter :: test_arange3 = arange3 == 37 .and. zrange3 == 37
269292
logical, parameter :: test_zrange4 = arange4 == 37 .and. zrange4 == 37
270293
logical, parameter :: test_zrange8 = arange8 == 307 .and. zrange8 == 307
294+
#if __x86_64__
271295
logical, parameter :: test_zrange10 = arange10 == 4931 .and. zrange10 == 4931
296+
#endif
272297
logical, parameter :: test_zrange16 = arange16 == 4931 .and. zrange16 == 4931
273298

274299
logical, parameter :: test_set_exponent_z = set_exponent(0., 999) == 0.

flang/test/Semantics/kinds03.f90

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,9 +60,6 @@
6060
!DEF: /MainProgram1/a8 ObjectEntity TYPE(rpdt(k=8_4))
6161
type(rpdt(8)) :: a8
6262
!REF: /MainProgram1/rpdt
63-
!DEF: /MainProgram1/a10 ObjectEntity TYPE(rpdt(k=10_4))
64-
type(rpdt(10)) :: a10
65-
!REF: /MainProgram1/rpdt
6663
!DEF: /MainProgram1/a16 ObjectEntity TYPE(rpdt(k=16_4))
6764
type(rpdt(16)) :: a16
6865
!REF: /MainProgram1/zpdt
@@ -75,9 +72,6 @@
7572
!DEF: /MainProgram1/z8 ObjectEntity TYPE(zpdt(k=8_4))
7673
type(zpdt(8)) :: z8
7774
!REF: /MainProgram1/zpdt
78-
!DEF: /MainProgram1/z10 ObjectEntity TYPE(zpdt(k=10_4))
79-
type(zpdt(10)) :: z10
80-
!REF: /MainProgram1/zpdt
8175
!DEF: /MainProgram1/z16 ObjectEntity TYPE(zpdt(k=16_4))
8276
type(zpdt(16)) :: z16
8377
!REF: /MainProgram1/lpdt

0 commit comments

Comments
 (0)