|
48 | 48 | #include "llvm/IR/IntrinsicsNVPTX.h" |
49 | 49 | #include "llvm/IR/IntrinsicsWebAssembly.h" |
50 | 50 | #include "llvm/IR/IntrinsicsX86.h" |
| 51 | +#include "llvm/IR/NVVMIntrinsicUtils.h" |
51 | 52 | #include "llvm/IR/Operator.h" |
52 | 53 | #include "llvm/IR/Type.h" |
53 | 54 | #include "llvm/IR/Value.h" |
@@ -290,144 +291,6 @@ Constant *FoldBitCast(Constant *C, Type *DestTy, const DataLayout &DL) { |
290 | 291 |
|
291 | 292 | return ConstantVector::get(Result); |
292 | 293 | } |
293 | | - |
294 | | -//===----------------------------------------------------------------------===// |
295 | | -// NVVM-specific internal helper functions |
296 | | -//===----------------------------------------------------------------------===// |
297 | | - |
298 | | -static bool NVVMIntrinsicShouldFTZ(Intrinsic::ID IntrinsicID) { |
299 | | - switch (IntrinsicID) { |
300 | | - // Float to i32 / i64 conversion intrinsics: |
301 | | - case Intrinsic::nvvm_f2i_rm_ftz: |
302 | | - case Intrinsic::nvvm_f2i_rn_ftz: |
303 | | - case Intrinsic::nvvm_f2i_rp_ftz: |
304 | | - case Intrinsic::nvvm_f2i_rz_ftz: |
305 | | - |
306 | | - case Intrinsic::nvvm_f2ui_rm_ftz: |
307 | | - case Intrinsic::nvvm_f2ui_rn_ftz: |
308 | | - case Intrinsic::nvvm_f2ui_rp_ftz: |
309 | | - case Intrinsic::nvvm_f2ui_rz_ftz: |
310 | | - |
311 | | - case Intrinsic::nvvm_f2ll_rm_ftz: |
312 | | - case Intrinsic::nvvm_f2ll_rn_ftz: |
313 | | - case Intrinsic::nvvm_f2ll_rp_ftz: |
314 | | - case Intrinsic::nvvm_f2ll_rz_ftz: |
315 | | - |
316 | | - case Intrinsic::nvvm_f2ull_rm_ftz: |
317 | | - case Intrinsic::nvvm_f2ull_rn_ftz: |
318 | | - case Intrinsic::nvvm_f2ull_rp_ftz: |
319 | | - case Intrinsic::nvvm_f2ull_rz_ftz: |
320 | | - return true; |
321 | | - } |
322 | | - return false; |
323 | | -} |
324 | | - |
325 | | -static bool NVVMIntrinsicConvertsToSignedInteger(Intrinsic::ID IntrinsicID) { |
326 | | - switch (IntrinsicID) { |
327 | | - // f2i |
328 | | - case Intrinsic::nvvm_f2i_rm: |
329 | | - case Intrinsic::nvvm_f2i_rm_ftz: |
330 | | - case Intrinsic::nvvm_f2i_rn: |
331 | | - case Intrinsic::nvvm_f2i_rn_ftz: |
332 | | - case Intrinsic::nvvm_f2i_rp: |
333 | | - case Intrinsic::nvvm_f2i_rp_ftz: |
334 | | - case Intrinsic::nvvm_f2i_rz: |
335 | | - case Intrinsic::nvvm_f2i_rz_ftz: |
336 | | - // d2i |
337 | | - case Intrinsic::nvvm_d2i_rm: |
338 | | - case Intrinsic::nvvm_d2i_rn: |
339 | | - case Intrinsic::nvvm_d2i_rp: |
340 | | - case Intrinsic::nvvm_d2i_rz: |
341 | | - // f2ll |
342 | | - case Intrinsic::nvvm_f2ll_rm: |
343 | | - case Intrinsic::nvvm_f2ll_rm_ftz: |
344 | | - case Intrinsic::nvvm_f2ll_rn: |
345 | | - case Intrinsic::nvvm_f2ll_rn_ftz: |
346 | | - case Intrinsic::nvvm_f2ll_rp: |
347 | | - case Intrinsic::nvvm_f2ll_rp_ftz: |
348 | | - case Intrinsic::nvvm_f2ll_rz: |
349 | | - case Intrinsic::nvvm_f2ll_rz_ftz: |
350 | | - // d2ll |
351 | | - case Intrinsic::nvvm_d2ll_rm: |
352 | | - case Intrinsic::nvvm_d2ll_rn: |
353 | | - case Intrinsic::nvvm_d2ll_rp: |
354 | | - case Intrinsic::nvvm_d2ll_rz: |
355 | | - return true; |
356 | | - } |
357 | | - return false; |
358 | | -} |
359 | | - |
360 | | -static APFloat::roundingMode |
361 | | -NVVMIntrinsicGetRoundingMode(Intrinsic::ID IntrinsicID) { |
362 | | - switch (IntrinsicID) { |
363 | | - // RM: |
364 | | - case Intrinsic::nvvm_f2i_rm: |
365 | | - case Intrinsic::nvvm_f2ui_rm: |
366 | | - case Intrinsic::nvvm_f2i_rm_ftz: |
367 | | - case Intrinsic::nvvm_f2ui_rm_ftz: |
368 | | - case Intrinsic::nvvm_d2i_rm: |
369 | | - case Intrinsic::nvvm_d2ui_rm: |
370 | | - |
371 | | - case Intrinsic::nvvm_f2ll_rm: |
372 | | - case Intrinsic::nvvm_f2ull_rm: |
373 | | - case Intrinsic::nvvm_f2ll_rm_ftz: |
374 | | - case Intrinsic::nvvm_f2ull_rm_ftz: |
375 | | - case Intrinsic::nvvm_d2ll_rm: |
376 | | - case Intrinsic::nvvm_d2ull_rm: |
377 | | - return APFloat::rmTowardNegative; |
378 | | - |
379 | | - // RN: |
380 | | - case Intrinsic::nvvm_f2i_rn: |
381 | | - case Intrinsic::nvvm_f2ui_rn: |
382 | | - case Intrinsic::nvvm_f2i_rn_ftz: |
383 | | - case Intrinsic::nvvm_f2ui_rn_ftz: |
384 | | - case Intrinsic::nvvm_d2i_rn: |
385 | | - case Intrinsic::nvvm_d2ui_rn: |
386 | | - |
387 | | - case Intrinsic::nvvm_f2ll_rn: |
388 | | - case Intrinsic::nvvm_f2ull_rn: |
389 | | - case Intrinsic::nvvm_f2ll_rn_ftz: |
390 | | - case Intrinsic::nvvm_f2ull_rn_ftz: |
391 | | - case Intrinsic::nvvm_d2ll_rn: |
392 | | - case Intrinsic::nvvm_d2ull_rn: |
393 | | - return APFloat::rmNearestTiesToEven; |
394 | | - |
395 | | - // RP: |
396 | | - case Intrinsic::nvvm_f2i_rp: |
397 | | - case Intrinsic::nvvm_f2ui_rp: |
398 | | - case Intrinsic::nvvm_f2i_rp_ftz: |
399 | | - case Intrinsic::nvvm_f2ui_rp_ftz: |
400 | | - case Intrinsic::nvvm_d2i_rp: |
401 | | - case Intrinsic::nvvm_d2ui_rp: |
402 | | - |
403 | | - case Intrinsic::nvvm_f2ll_rp: |
404 | | - case Intrinsic::nvvm_f2ull_rp: |
405 | | - case Intrinsic::nvvm_f2ll_rp_ftz: |
406 | | - case Intrinsic::nvvm_f2ull_rp_ftz: |
407 | | - case Intrinsic::nvvm_d2ll_rp: |
408 | | - case Intrinsic::nvvm_d2ull_rp: |
409 | | - return APFloat::rmTowardPositive; |
410 | | - |
411 | | - // RZ: |
412 | | - case Intrinsic::nvvm_f2i_rz: |
413 | | - case Intrinsic::nvvm_f2ui_rz: |
414 | | - case Intrinsic::nvvm_f2i_rz_ftz: |
415 | | - case Intrinsic::nvvm_f2ui_rz_ftz: |
416 | | - case Intrinsic::nvvm_d2i_rz: |
417 | | - case Intrinsic::nvvm_d2ui_rz: |
418 | | - |
419 | | - case Intrinsic::nvvm_f2ll_rz: |
420 | | - case Intrinsic::nvvm_f2ull_rz: |
421 | | - case Intrinsic::nvvm_f2ll_rz_ftz: |
422 | | - case Intrinsic::nvvm_f2ull_rz_ftz: |
423 | | - case Intrinsic::nvvm_d2ll_rz: |
424 | | - case Intrinsic::nvvm_d2ull_rz: |
425 | | - return APFloat::rmTowardZero; |
426 | | - } |
427 | | - llvm_unreachable("Invalid f2i/d2i rounding mode intrinsic"); |
428 | | - return APFloat::roundingMode::Invalid; |
429 | | -} |
430 | | - |
431 | 294 | } // end anonymous namespace |
432 | 295 |
|
433 | 296 | /// If this constant is a constant offset from a global, return the global and |
@@ -2567,11 +2430,11 @@ static Constant *ConstantFoldScalarCall1(StringRef Name, |
2567 | 2430 | if (U.isNaN()) |
2568 | 2431 | return ConstantInt::get(Ty, 0); |
2569 | 2432 |
|
2570 | | - APFloat::roundingMode RMode = NVVMIntrinsicGetRoundingMode(IntrinsicID); |
| 2433 | + APFloat::roundingMode RMode = nvvm::IntrinsicGetRoundingMode(IntrinsicID); |
2571 | 2434 | assert(RM != APFloat::roundingMode::Invalid); |
2572 | 2435 |
|
2573 | | - bool IsFTZ = NVVMIntrinsicShouldFTZ(IntrinsicID); |
2574 | | - bool IsSigned = NVVMIntrinsicConvertsToSignedInteger(IntrinsicID); |
| 2436 | + bool IsFTZ = nvvm::IntrinsicShouldFTZ(IntrinsicID); |
| 2437 | + bool IsSigned = nvvm::IntrinsicConvertsToSignedInteger(IntrinsicID); |
2575 | 2438 |
|
2576 | 2439 | APSInt ResInt(Ty->getIntegerBitWidth(), !IsSigned); |
2577 | 2440 | auto FloatToRound = IsFTZ ? FTZPreserveSign(U) : U; |
|
0 commit comments