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