ClipMode.cmake 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. include (CheckCSourceRuns)
  2. include (CMakePushCheckState)
  3. macro (CLIP_MODE)
  4. if ((NOT DEFINED CPU_CLIPS_NEGATIVE) AND (NOT DEFINED CPU_CLIPS_POSITIVE))
  5. set (CLIP_MODE_POSITIVE_MESSAGE "Target processor clips on positive float to int conversion")
  6. set (CLIP_MODE_NEGATIVE_MESSAGE "Target processor clips on negative float to int conversion")
  7. message (STATUS "Checking processor clipping capabilities...")
  8. if (CMAKE_CROSSCOMPILING)
  9. set (CLIP_MSG "disabled")
  10. set (CPU_CLIPS_POSITIVE FALSE CACHE BOOL ${CLIP_MODE_POSITIVE_MESSAGE})
  11. set (CPU_CLIPS_NEGATIVE FALSE CACHE BOOL ${CLIP_MODE_NEGATIVE_MESSAGE})
  12. else (NOT CMAKE_CROSSCOMPILING)
  13. cmake_push_check_state ()
  14. set (CMAKE_REQUIRED_QUIET TRUE)
  15. if (LIBM_REQUIRED)
  16. set (CMAKE_REQUIRED_LIBRARIES ${CMAKE_REQUIRED_LIBRARIES} ${M_LIBRARY})
  17. endif ()
  18. check_c_source_runs (
  19. "
  20. #define _ISOC9X_SOURCE 1
  21. #define _ISOC99_SOURCE 1
  22. #define __USE_ISOC99 1
  23. #define __USE_ISOC9X 1
  24. #include <math.h>
  25. int main (void)
  26. { double fval ;
  27. int k, ival ;
  28. fval = 1.0 * 0x7FFFFFFF ;
  29. for (k = 0 ; k < 100 ; k++)
  30. { ival = (lrint (fval)) >> 24 ;
  31. if (ival != 127)
  32. return 1 ;
  33. fval *= 1.2499999 ;
  34. } ;
  35. return 0 ;
  36. }
  37. "
  38. CPU_CLIPS_POSITIVE)
  39. check_c_source_runs (
  40. "
  41. #define _ISOC9X_SOURCE 1
  42. #define _ISOC99_SOURCE 1
  43. #define __USE_ISOC99 1
  44. #define __USE_ISOC9X 1
  45. #include <math.h>
  46. int main (void)
  47. { double fval ;
  48. int k, ival ;
  49. fval = -8.0 * 0x10000000 ;
  50. for (k = 0 ; k < 100 ; k++)
  51. { ival = (lrint (fval)) >> 24 ;
  52. if (ival != -128)
  53. return 1 ;
  54. fval *= 1.2499999 ;
  55. } ;
  56. return 0 ;
  57. }
  58. "
  59. CPU_CLIPS_NEGATIVE)
  60. cmake_pop_check_state ()
  61. if (CPU_CLIPS_POSITIVE AND (NOT CPU_CLIPS_NEGATIVE))
  62. set (CLIP_MSG "positive")
  63. elseif (CPU_CLIPS_NEGATIVE AND (NOT CPU_CLIPS_POSITIVE))
  64. set (CLIP_MSG "negative")
  65. elseif (CPU_CLIPS_POSITIVE AND CPU_CLIPS_NEGATIVE)
  66. set (CLIP_MSG "both")
  67. else ()
  68. set (CLIP_MSG "none")
  69. endif ()
  70. endif (CMAKE_CROSSCOMPILING)
  71. message (STATUS "Checking processor clipping capabilities... ${CLIP_MSG}")
  72. endif ()
  73. endmacro (CLIP_MODE)