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