@@ -38,9 +38,8 @@ enum class TMAReductionOp : uint8_t {
3838 XOR = 7 ,
3939};
4040
41- inline bool IntrinsicShouldFTZ (Intrinsic::ID IntrinsicID) {
41+ inline bool FPToIntegerIntrinsicShouldFTZ (Intrinsic::ID IntrinsicID) {
4242 switch (IntrinsicID) {
43- // Float to i32 / i64 conversion intrinsics:
4443 case Intrinsic::nvvm_f2i_rm_ftz:
4544 case Intrinsic::nvvm_f2i_rn_ftz:
4645 case Intrinsic::nvvm_f2i_rp_ftz:
@@ -61,11 +60,53 @@ inline bool IntrinsicShouldFTZ(Intrinsic::ID IntrinsicID) {
6160 case Intrinsic::nvvm_f2ull_rp_ftz:
6261 case Intrinsic::nvvm_f2ull_rz_ftz:
6362 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 ;
64104 }
105+ llvm_unreachable (" Checking FTZ flag for invalid f2i/d2i intrinsic" );
65106 return false ;
66107}
67108
68- inline bool IntrinsicConvertsToSignedInteger (Intrinsic::ID IntrinsicID) {
109+ inline bool FPToIntegerIntrinsicResultIsSigned (Intrinsic::ID IntrinsicID) {
69110 switch (IntrinsicID) {
70111 // f2i
71112 case Intrinsic::nvvm_f2i_rm:
@@ -96,12 +137,44 @@ inline bool IntrinsicConvertsToSignedInteger(Intrinsic::ID IntrinsicID) {
96137 case Intrinsic::nvvm_d2ll_rp:
97138 case Intrinsic::nvvm_d2ll_rz:
98139 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 ;
99170 }
171+ llvm_unreachable (
172+ " Checking invalid f2i/d2i intrinsic for signed int conversion" );
100173 return false ;
101174}
102175
103176inline APFloat::roundingMode
104- IntrinsicGetRoundingMode (Intrinsic::ID IntrinsicID) {
177+ GetFPToIntegerRoundingMode (Intrinsic::ID IntrinsicID) {
105178 switch (IntrinsicID) {
106179 // RM:
107180 case Intrinsic::nvvm_f2i_rm:
@@ -167,10 +240,100 @@ IntrinsicGetRoundingMode(Intrinsic::ID IntrinsicID) {
167240 case Intrinsic::nvvm_d2ull_rz:
168241 return APFloat::rmTowardZero;
169242 }
170- llvm_unreachable (" Invalid f2i/d2i rounding mode intrinsic" );
243+ llvm_unreachable (" Checking rounding mode for invalid f2i/d2i intrinsic" );
171244 return APFloat::roundingMode::Invalid;
172245}
173246
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+
174337} // namespace nvvm
175338} // namespace llvm
176339#endif // LLVM_IR_NVVMINTRINSICUTILS_H
0 commit comments