@@ -38,9 +38,8 @@ enum class TMAReductionOp : uint8_t {
38
38
XOR = 7 ,
39
39
};
40
40
41
- inline bool IntrinsicShouldFTZ (Intrinsic::ID IntrinsicID) {
41
+ inline bool FPToIntegerIntrinsicShouldFTZ (Intrinsic::ID IntrinsicID) {
42
42
switch (IntrinsicID) {
43
- // Float to i32 / i64 conversion intrinsics:
44
43
case Intrinsic::nvvm_f2i_rm_ftz:
45
44
case Intrinsic::nvvm_f2i_rn_ftz:
46
45
case Intrinsic::nvvm_f2i_rp_ftz:
@@ -61,11 +60,53 @@ inline bool IntrinsicShouldFTZ(Intrinsic::ID IntrinsicID) {
61
60
case Intrinsic::nvvm_f2ull_rp_ftz:
62
61
case Intrinsic::nvvm_f2ull_rz_ftz:
63
62
return true ;
63
+
64
+ case Intrinsic::nvvm_f2i_rm:
65
+ case Intrinsic::nvvm_f2i_rn:
66
+ case Intrinsic::nvvm_f2i_rp:
67
+ case Intrinsic::nvvm_f2i_rz:
68
+
69
+ case Intrinsic::nvvm_f2ui_rm:
70
+ case Intrinsic::nvvm_f2ui_rn:
71
+ case Intrinsic::nvvm_f2ui_rp:
72
+ case Intrinsic::nvvm_f2ui_rz:
73
+
74
+ case Intrinsic::nvvm_d2i_rm:
75
+ case Intrinsic::nvvm_d2i_rn:
76
+ case Intrinsic::nvvm_d2i_rp:
77
+ case Intrinsic::nvvm_d2i_rz:
78
+
79
+ case Intrinsic::nvvm_d2ui_rm:
80
+ case Intrinsic::nvvm_d2ui_rn:
81
+ case Intrinsic::nvvm_d2ui_rp:
82
+ case Intrinsic::nvvm_d2ui_rz:
83
+
84
+ case Intrinsic::nvvm_f2ll_rm:
85
+ case Intrinsic::nvvm_f2ll_rn:
86
+ case Intrinsic::nvvm_f2ll_rp:
87
+ case Intrinsic::nvvm_f2ll_rz:
88
+
89
+ case Intrinsic::nvvm_f2ull_rm:
90
+ case Intrinsic::nvvm_f2ull_rn:
91
+ case Intrinsic::nvvm_f2ull_rp:
92
+ case Intrinsic::nvvm_f2ull_rz:
93
+
94
+ case Intrinsic::nvvm_d2ll_rm:
95
+ case Intrinsic::nvvm_d2ll_rn:
96
+ case Intrinsic::nvvm_d2ll_rp:
97
+ case Intrinsic::nvvm_d2ll_rz:
98
+
99
+ case Intrinsic::nvvm_d2ull_rm:
100
+ case Intrinsic::nvvm_d2ull_rn:
101
+ case Intrinsic::nvvm_d2ull_rp:
102
+ case Intrinsic::nvvm_d2ull_rz:
103
+ return false ;
64
104
}
105
+ llvm_unreachable (" Checking FTZ flag for invalid f2i/d2i intrinsic" );
65
106
return false ;
66
107
}
67
108
68
- inline bool IntrinsicConvertsToSignedInteger (Intrinsic::ID IntrinsicID) {
109
+ inline bool FPToIntegerIntrinsicResultIsSigned (Intrinsic::ID IntrinsicID) {
69
110
switch (IntrinsicID) {
70
111
// f2i
71
112
case Intrinsic::nvvm_f2i_rm:
@@ -96,12 +137,44 @@ inline bool IntrinsicConvertsToSignedInteger(Intrinsic::ID IntrinsicID) {
96
137
case Intrinsic::nvvm_d2ll_rp:
97
138
case Intrinsic::nvvm_d2ll_rz:
98
139
return true ;
140
+
141
+ // f2ui
142
+ case Intrinsic::nvvm_f2ui_rm:
143
+ case Intrinsic::nvvm_f2ui_rm_ftz:
144
+ case Intrinsic::nvvm_f2ui_rn:
145
+ case Intrinsic::nvvm_f2ui_rn_ftz:
146
+ case Intrinsic::nvvm_f2ui_rp:
147
+ case Intrinsic::nvvm_f2ui_rp_ftz:
148
+ case Intrinsic::nvvm_f2ui_rz:
149
+ case Intrinsic::nvvm_f2ui_rz_ftz:
150
+ // d2ui
151
+ case Intrinsic::nvvm_d2ui_rm:
152
+ case Intrinsic::nvvm_d2ui_rn:
153
+ case Intrinsic::nvvm_d2ui_rp:
154
+ case Intrinsic::nvvm_d2ui_rz:
155
+ // f2ull
156
+ case Intrinsic::nvvm_f2ull_rm:
157
+ case Intrinsic::nvvm_f2ull_rm_ftz:
158
+ case Intrinsic::nvvm_f2ull_rn:
159
+ case Intrinsic::nvvm_f2ull_rn_ftz:
160
+ case Intrinsic::nvvm_f2ull_rp:
161
+ case Intrinsic::nvvm_f2ull_rp_ftz:
162
+ case Intrinsic::nvvm_f2ull_rz:
163
+ case Intrinsic::nvvm_f2ull_rz_ftz:
164
+ // d2ull
165
+ case Intrinsic::nvvm_d2ull_rm:
166
+ case Intrinsic::nvvm_d2ull_rn:
167
+ case Intrinsic::nvvm_d2ull_rp:
168
+ case Intrinsic::nvvm_d2ull_rz:
169
+ return false ;
99
170
}
171
+ llvm_unreachable (
172
+ " Checking invalid f2i/d2i intrinsic for signed int conversion" );
100
173
return false ;
101
174
}
102
175
103
176
inline APFloat::roundingMode
104
- IntrinsicGetRoundingMode (Intrinsic::ID IntrinsicID) {
177
+ GetFPToIntegerRoundingMode (Intrinsic::ID IntrinsicID) {
105
178
switch (IntrinsicID) {
106
179
// RM:
107
180
case Intrinsic::nvvm_f2i_rm:
@@ -167,10 +240,100 @@ IntrinsicGetRoundingMode(Intrinsic::ID IntrinsicID) {
167
240
case Intrinsic::nvvm_d2ull_rz:
168
241
return APFloat::rmTowardZero;
169
242
}
170
- llvm_unreachable (" Invalid f2i/d2i rounding mode intrinsic" );
243
+ llvm_unreachable (" Checking rounding mode for invalid f2i/d2i intrinsic" );
171
244
return APFloat::roundingMode::Invalid;
172
245
}
173
246
247
+ inline bool FMinFMaxShouldFTZ (Intrinsic::ID IntrinsicID) {
248
+ switch (IntrinsicID) {
249
+ case Intrinsic::nvvm_fmax_ftz_f:
250
+ case Intrinsic::nvvm_fmax_ftz_nan_f:
251
+ case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
252
+ case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
253
+
254
+ case Intrinsic::nvvm_fmin_ftz_f:
255
+ case Intrinsic::nvvm_fmin_ftz_nan_f:
256
+ case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
257
+ case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
258
+ return true ;
259
+
260
+ case Intrinsic::nvvm_fmax_d:
261
+ case Intrinsic::nvvm_fmax_f:
262
+ case Intrinsic::nvvm_fmax_nan_f:
263
+ case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
264
+ case Intrinsic::nvvm_fmax_xorsign_abs_f:
265
+
266
+ case Intrinsic::nvvm_fmin_d:
267
+ case Intrinsic::nvvm_fmin_f:
268
+ case Intrinsic::nvvm_fmin_nan_f:
269
+ case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
270
+ case Intrinsic::nvvm_fmin_xorsign_abs_f:
271
+ return false ;
272
+ }
273
+ llvm_unreachable (" Checking FTZ flag for invalid fmin/fmax intrinsic" );
274
+ return false ;
275
+ }
276
+
277
+ inline bool FMinFMaxPropagatesNaNs (Intrinsic::ID IntrinsicID) {
278
+ switch (IntrinsicID) {
279
+ case Intrinsic::nvvm_fmax_ftz_nan_f:
280
+ case Intrinsic::nvvm_fmax_nan_f:
281
+ case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
282
+ case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
283
+
284
+ case Intrinsic::nvvm_fmin_ftz_nan_f:
285
+ case Intrinsic::nvvm_fmin_nan_f:
286
+ case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
287
+ case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
288
+ return true ;
289
+
290
+ case Intrinsic::nvvm_fmax_d:
291
+ case Intrinsic::nvvm_fmax_f:
292
+ case Intrinsic::nvvm_fmax_ftz_f:
293
+ case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
294
+ case Intrinsic::nvvm_fmax_xorsign_abs_f:
295
+
296
+ case Intrinsic::nvvm_fmin_d:
297
+ case Intrinsic::nvvm_fmin_f:
298
+ case Intrinsic::nvvm_fmin_ftz_f:
299
+ case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
300
+ case Intrinsic::nvvm_fmin_xorsign_abs_f:
301
+ return false ;
302
+ }
303
+ llvm_unreachable (" Checking NaN flag for invalid fmin/fmax intrinsic" );
304
+ return false ;
305
+ }
306
+
307
+ inline bool FMinFMaxIsXorSignAbs (Intrinsic::ID IntrinsicID) {
308
+ switch (IntrinsicID) {
309
+ case Intrinsic::nvvm_fmax_ftz_nan_xorsign_abs_f:
310
+ case Intrinsic::nvvm_fmax_ftz_xorsign_abs_f:
311
+ case Intrinsic::nvvm_fmax_nan_xorsign_abs_f:
312
+ case Intrinsic::nvvm_fmax_xorsign_abs_f:
313
+
314
+ case Intrinsic::nvvm_fmin_ftz_nan_xorsign_abs_f:
315
+ case Intrinsic::nvvm_fmin_ftz_xorsign_abs_f:
316
+ case Intrinsic::nvvm_fmin_nan_xorsign_abs_f:
317
+ case Intrinsic::nvvm_fmin_xorsign_abs_f:
318
+ return true ;
319
+
320
+ case Intrinsic::nvvm_fmax_d:
321
+ case Intrinsic::nvvm_fmax_f:
322
+ case Intrinsic::nvvm_fmax_ftz_f:
323
+ case Intrinsic::nvvm_fmax_ftz_nan_f:
324
+ case Intrinsic::nvvm_fmax_nan_f:
325
+
326
+ case Intrinsic::nvvm_fmin_d:
327
+ case Intrinsic::nvvm_fmin_f:
328
+ case Intrinsic::nvvm_fmin_ftz_f:
329
+ case Intrinsic::nvvm_fmin_ftz_nan_f:
330
+ case Intrinsic::nvvm_fmin_nan_f:
331
+ return false ;
332
+ }
333
+ llvm_unreachable (" Checking XorSignAbs flag for invalid fmin/fmax intrinsic" );
334
+ return false ;
335
+ }
336
+
174
337
} // namespace nvvm
175
338
} // namespace llvm
176
339
#endif // LLVM_IR_NVVMINTRINSICUTILS_H
0 commit comments