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