LAA: improve code in getStrideFromPointer (NFC) (#124780)
[llvm-project.git] / flang / runtime / type-code.cpp
blobd6948983bfe9f3c0da13d77a30320f771b286017
1 //===-- runtime/type-code.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-exception
6 //
7 //===----------------------------------------------------------------------===//
9 #include "flang/Runtime/type-code.h"
11 namespace Fortran::runtime {
13 RT_OFFLOAD_API_GROUP_BEGIN
15 RT_API_ATTRS TypeCode::TypeCode(TypeCategory f, int kind) {
16 switch (f) {
17 case TypeCategory::Integer:
18 switch (kind) {
19 case 1:
20 raw_ = CFI_type_int8_t;
21 break;
22 case 2:
23 raw_ = CFI_type_int16_t;
24 break;
25 case 4:
26 raw_ = CFI_type_int32_t;
27 break;
28 case 8:
29 raw_ = CFI_type_int64_t;
30 break;
31 case 16:
32 raw_ = CFI_type_int128_t;
33 break;
35 break;
36 case TypeCategory::Unsigned:
37 switch (kind) {
38 case 1:
39 raw_ = CFI_type_uint8_t;
40 break;
41 case 2:
42 raw_ = CFI_type_uint16_t;
43 break;
44 case 4:
45 raw_ = CFI_type_uint32_t;
46 break;
47 case 8:
48 raw_ = CFI_type_uint64_t;
49 break;
50 case 16:
51 raw_ = CFI_type_uint128_t;
52 break;
54 break;
55 case TypeCategory::Real:
56 switch (kind) {
57 case 2:
58 raw_ = CFI_type_half_float;
59 break;
60 case 3:
61 raw_ = CFI_type_bfloat;
62 break;
63 case 4:
64 raw_ = CFI_type_float;
65 break;
66 case 8:
67 raw_ = CFI_type_double;
68 break;
69 case 10:
70 raw_ = CFI_type_extended_double;
71 break;
72 case 16:
73 raw_ = CFI_type_float128;
74 break;
76 break;
77 case TypeCategory::Complex:
78 switch (kind) {
79 case 2:
80 raw_ = CFI_type_half_float_Complex;
81 break;
82 case 3:
83 raw_ = CFI_type_bfloat_Complex;
84 break;
85 case 4:
86 raw_ = CFI_type_float_Complex;
87 break;
88 case 8:
89 raw_ = CFI_type_double_Complex;
90 break;
91 case 10:
92 raw_ = CFI_type_extended_double_Complex;
93 break;
94 case 16:
95 raw_ = CFI_type_long_double_Complex;
96 break;
98 break;
99 case TypeCategory::Character:
100 switch (kind) {
101 case 1:
102 raw_ = CFI_type_char;
103 break;
104 case 2:
105 raw_ = CFI_type_char16_t;
106 break;
107 case 4:
108 raw_ = CFI_type_char32_t;
109 break;
111 break;
112 case TypeCategory::Logical:
113 switch (kind) {
114 case 1:
115 raw_ = CFI_type_Bool;
116 break;
117 case 2:
118 raw_ = CFI_type_int_least16_t;
119 break;
120 case 4:
121 raw_ = CFI_type_int_least32_t;
122 break;
123 case 8:
124 raw_ = CFI_type_int_least64_t;
125 break;
127 break;
128 case TypeCategory::Derived:
129 raw_ = CFI_type_struct;
130 break;
134 RT_API_ATTRS Fortran::common::optional<std::pair<TypeCategory, int>>
135 TypeCode::GetCategoryAndKind() const {
136 switch (raw_) {
137 case CFI_type_signed_char:
138 return std::make_pair(TypeCategory::Character, sizeof(signed char));
139 case CFI_type_short:
140 return std::make_pair(TypeCategory::Integer, sizeof(short));
141 case CFI_type_int:
142 return std::make_pair(TypeCategory::Integer, sizeof(int));
143 case CFI_type_long:
144 return std::make_pair(TypeCategory::Integer, sizeof(long));
145 case CFI_type_long_long:
146 return std::make_pair(TypeCategory::Integer, sizeof(long long));
147 case CFI_type_size_t:
148 return std::make_pair(TypeCategory::Integer, sizeof(std::size_t));
149 case CFI_type_int8_t:
150 return std::make_pair(TypeCategory::Integer, 1);
151 case CFI_type_int16_t:
152 return std::make_pair(TypeCategory::Integer, 2);
153 case CFI_type_int32_t:
154 return std::make_pair(TypeCategory::Integer, 4);
155 case CFI_type_int64_t:
156 return std::make_pair(TypeCategory::Integer, 8);
157 case CFI_type_int128_t:
158 return std::make_pair(TypeCategory::Integer, 16);
159 case CFI_type_int_least8_t:
160 return std::make_pair(TypeCategory::Logical, 1);
161 case CFI_type_int_least16_t:
162 return std::make_pair(TypeCategory::Logical, 2);
163 case CFI_type_int_least32_t:
164 return std::make_pair(TypeCategory::Logical, 4);
165 case CFI_type_int_least64_t:
166 return std::make_pair(TypeCategory::Logical, 8);
167 case CFI_type_int_least128_t:
168 return std::make_pair(TypeCategory::Integer, 16);
169 case CFI_type_int_fast8_t:
170 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast8_t));
171 case CFI_type_int_fast16_t:
172 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast16_t));
173 case CFI_type_int_fast32_t:
174 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast32_t));
175 case CFI_type_int_fast64_t:
176 return std::make_pair(TypeCategory::Integer, sizeof(std::int_fast64_t));
177 case CFI_type_int_fast128_t:
178 return std::make_pair(TypeCategory::Integer, 16);
179 case CFI_type_intmax_t:
180 return std::make_pair(TypeCategory::Integer, sizeof(std::intmax_t));
181 case CFI_type_intptr_t:
182 return std::make_pair(TypeCategory::Integer, sizeof(std::intptr_t));
183 case CFI_type_ptrdiff_t:
184 return std::make_pair(TypeCategory::Integer, sizeof(std::ptrdiff_t));
185 case CFI_type_half_float:
186 return std::make_pair(TypeCategory::Real, 2);
187 case CFI_type_bfloat:
188 return std::make_pair(TypeCategory::Real, 3);
189 case CFI_type_float:
190 return std::make_pair(TypeCategory::Real, 4);
191 case CFI_type_double:
192 return std::make_pair(TypeCategory::Real, 8);
193 case CFI_type_extended_double:
194 return std::make_pair(TypeCategory::Real, 10);
195 case CFI_type_long_double:
196 return std::make_pair(TypeCategory::Real, 16);
197 case CFI_type_float128:
198 return std::make_pair(TypeCategory::Real, 16);
199 case CFI_type_half_float_Complex:
200 return std::make_pair(TypeCategory::Complex, 2);
201 case CFI_type_bfloat_Complex:
202 return std::make_pair(TypeCategory::Complex, 3);
203 case CFI_type_float_Complex:
204 return std::make_pair(TypeCategory::Complex, 4);
205 case CFI_type_double_Complex:
206 return std::make_pair(TypeCategory::Complex, 8);
207 case CFI_type_extended_double_Complex:
208 return std::make_pair(TypeCategory::Complex, 10);
209 case CFI_type_long_double_Complex:
210 return std::make_pair(TypeCategory::Complex, 16);
211 case CFI_type_float128_Complex:
212 return std::make_pair(TypeCategory::Complex, 16);
213 case CFI_type_Bool:
214 return std::make_pair(TypeCategory::Logical, 1);
215 case CFI_type_char:
216 return std::make_pair(TypeCategory::Character, 1);
217 case CFI_type_cptr:
218 return std::make_pair(TypeCategory::Integer, sizeof(void *));
219 case CFI_type_struct:
220 return std::make_pair(TypeCategory::Derived, 0);
221 case CFI_type_char16_t:
222 return std::make_pair(TypeCategory::Character, 2);
223 case CFI_type_char32_t:
224 return std::make_pair(TypeCategory::Character, 4);
225 case CFI_type_uint8_t:
226 return std::make_pair(TypeCategory::Unsigned, 1);
227 case CFI_type_uint16_t:
228 return std::make_pair(TypeCategory::Unsigned, 2);
229 case CFI_type_uint32_t:
230 return std::make_pair(TypeCategory::Unsigned, 4);
231 case CFI_type_uint64_t:
232 return std::make_pair(TypeCategory::Unsigned, 8);
233 case CFI_type_uint128_t:
234 return std::make_pair(TypeCategory::Unsigned, 16);
235 default:
236 return Fortran::common::nullopt;
240 RT_OFFLOAD_API_GROUP_END
242 } // namespace Fortran::runtime