| 30 |
ashish |
1 |
dnl @synopsis AX_SIGNED_RIGHT_SHIFT
|
|
|
2 |
dnl
|
|
|
3 |
dnl Tests the behavior of a right shift on a negative signed int.
|
|
|
4 |
dnl
|
|
|
5 |
dnl This macro calls:
|
|
|
6 |
dnl AC_DEFINE(SIGNED_RIGHT_SHIFT_IS)
|
|
|
7 |
dnl AC_DEFINE(ARITHMETIC_RIGHT_SHIFT)
|
|
|
8 |
dnl AC_DEFINE(LOGICAL_RIGHT_SHIFT)
|
|
|
9 |
dnl AC_DEFINE(UNKNOWN_RIGHT_SHIFT)
|
|
|
10 |
dnl
|
|
|
11 |
dnl SIGNED_RIGHT_SHIFT_IS will be equal to one of the other macros.
|
|
|
12 |
dnl It also leaves the shell variables "ax_signed_right_shift"
|
|
|
13 |
dnl set to "arithmetic", "logical", or "unknown".
|
|
|
14 |
dnl
|
|
|
15 |
dnl NOTE: This macro does not work for cross-compiling.
|
|
|
16 |
dnl
|
|
|
17 |
dnl @category C
|
|
|
18 |
dnl @version 2009-03-25
|
|
|
19 |
dnl @license AllPermissive
|
|
|
20 |
dnl
|
|
|
21 |
dnl Copyright (C) 2009 David Reiss
|
|
|
22 |
dnl Copying and distribution of this file, with or without modification,
|
|
|
23 |
dnl are permitted in any medium without royalty provided the copyright
|
|
|
24 |
dnl notice and this notice are preserved.
|
|
|
25 |
|
|
|
26 |
AC_DEFUN([AX_SIGNED_RIGHT_SHIFT],
|
|
|
27 |
[
|
|
|
28 |
|
|
|
29 |
AC_MSG_CHECKING(the behavior of a signed right shift)
|
|
|
30 |
|
|
|
31 |
success_arithmetic=no
|
|
|
32 |
AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[
|
|
|
33 |
return
|
|
|
34 |
/* 0xffffffff */
|
|
|
35 |
-1 >> 1 != -1 ||
|
|
|
36 |
-1 >> 2 != -1 ||
|
|
|
37 |
-1 >> 3 != -1 ||
|
|
|
38 |
-1 >> 4 != -1 ||
|
|
|
39 |
-1 >> 8 != -1 ||
|
|
|
40 |
-1 >> 16 != -1 ||
|
|
|
41 |
-1 >> 24 != -1 ||
|
|
|
42 |
-1 >> 31 != -1 ||
|
|
|
43 |
/* 0x80000000 */
|
|
|
44 |
(-2147483647 - 1) >> 1 != -1073741824 ||
|
|
|
45 |
(-2147483647 - 1) >> 2 != -536870912 ||
|
|
|
46 |
(-2147483647 - 1) >> 3 != -268435456 ||
|
|
|
47 |
(-2147483647 - 1) >> 4 != -134217728 ||
|
|
|
48 |
(-2147483647 - 1) >> 8 != -8388608 ||
|
|
|
49 |
(-2147483647 - 1) >> 16 != -32768 ||
|
|
|
50 |
(-2147483647 - 1) >> 24 != -128 ||
|
|
|
51 |
(-2147483647 - 1) >> 31 != -1 ||
|
|
|
52 |
/* 0x90800000 */
|
|
|
53 |
-1870659584 >> 1 != -935329792 ||
|
|
|
54 |
-1870659584 >> 2 != -467664896 ||
|
|
|
55 |
-1870659584 >> 3 != -233832448 ||
|
|
|
56 |
-1870659584 >> 4 != -116916224 ||
|
|
|
57 |
-1870659584 >> 8 != -7307264 ||
|
|
|
58 |
-1870659584 >> 16 != -28544 ||
|
|
|
59 |
-1870659584 >> 24 != -112 ||
|
|
|
60 |
-1870659584 >> 31 != -1 ||
|
|
|
61 |
0;
|
|
|
62 |
]])], [
|
|
|
63 |
success_arithmetic=yes
|
|
|
64 |
])
|
|
|
65 |
|
|
|
66 |
|
|
|
67 |
success_logical=no
|
|
|
68 |
AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[
|
|
|
69 |
return
|
|
|
70 |
/* 0xffffffff */
|
|
|
71 |
-1 >> 1 != (signed)((unsigned)-1 >> 1) ||
|
|
|
72 |
-1 >> 2 != (signed)((unsigned)-1 >> 2) ||
|
|
|
73 |
-1 >> 3 != (signed)((unsigned)-1 >> 3) ||
|
|
|
74 |
-1 >> 4 != (signed)((unsigned)-1 >> 4) ||
|
|
|
75 |
-1 >> 8 != (signed)((unsigned)-1 >> 8) ||
|
|
|
76 |
-1 >> 16 != (signed)((unsigned)-1 >> 16) ||
|
|
|
77 |
-1 >> 24 != (signed)((unsigned)-1 >> 24) ||
|
|
|
78 |
-1 >> 31 != (signed)((unsigned)-1 >> 31) ||
|
|
|
79 |
/* 0x80000000 */
|
|
|
80 |
(-2147483647 - 1) >> 1 != (signed)((unsigned)(-2147483647 - 1) >> 1) ||
|
|
|
81 |
(-2147483647 - 1) >> 2 != (signed)((unsigned)(-2147483647 - 1) >> 2) ||
|
|
|
82 |
(-2147483647 - 1) >> 3 != (signed)((unsigned)(-2147483647 - 1) >> 3) ||
|
|
|
83 |
(-2147483647 - 1) >> 4 != (signed)((unsigned)(-2147483647 - 1) >> 4) ||
|
|
|
84 |
(-2147483647 - 1) >> 8 != (signed)((unsigned)(-2147483647 - 1) >> 8) ||
|
|
|
85 |
(-2147483647 - 1) >> 16 != (signed)((unsigned)(-2147483647 - 1) >> 16) ||
|
|
|
86 |
(-2147483647 - 1) >> 24 != (signed)((unsigned)(-2147483647 - 1) >> 24) ||
|
|
|
87 |
(-2147483647 - 1) >> 31 != (signed)((unsigned)(-2147483647 - 1) >> 31) ||
|
|
|
88 |
/* 0x90800000 */
|
|
|
89 |
-1870659584 >> 1 != (signed)((unsigned)-1870659584 >> 1) ||
|
|
|
90 |
-1870659584 >> 2 != (signed)((unsigned)-1870659584 >> 2) ||
|
|
|
91 |
-1870659584 >> 3 != (signed)((unsigned)-1870659584 >> 3) ||
|
|
|
92 |
-1870659584 >> 4 != (signed)((unsigned)-1870659584 >> 4) ||
|
|
|
93 |
-1870659584 >> 8 != (signed)((unsigned)-1870659584 >> 8) ||
|
|
|
94 |
-1870659584 >> 16 != (signed)((unsigned)-1870659584 >> 16) ||
|
|
|
95 |
-1870659584 >> 24 != (signed)((unsigned)-1870659584 >> 24) ||
|
|
|
96 |
-1870659584 >> 31 != (signed)((unsigned)-1870659584 >> 31) ||
|
|
|
97 |
0;
|
|
|
98 |
]])], [
|
|
|
99 |
success_logical=yes
|
|
|
100 |
])
|
|
|
101 |
|
|
|
102 |
|
|
|
103 |
AC_DEFINE([ARITHMETIC_RIGHT_SHIFT], 1, [Possible value for SIGNED_RIGHT_SHIFT_IS])
|
|
|
104 |
AC_DEFINE([LOGICAL_RIGHT_SHIFT], 2, [Possible value for SIGNED_RIGHT_SHIFT_IS])
|
|
|
105 |
AC_DEFINE([UNKNOWN_RIGHT_SHIFT], 3, [Possible value for SIGNED_RIGHT_SHIFT_IS])
|
|
|
106 |
|
|
|
107 |
if test "$success_arithmetic" = "yes" && test "$success_logica" = "yes" ; then
|
|
|
108 |
AC_MSG_ERROR("Right shift appears to be both arithmetic and logical!")
|
|
|
109 |
elif test "$success_arithmetic" = "yes" ; then
|
|
|
110 |
ax_signed_right_shift=arithmetic
|
|
|
111 |
AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 1,
|
|
|
112 |
[Indicates the effect of the right shift operator
|
|
|
113 |
on negative signed integers])
|
|
|
114 |
elif test "$success_logical" = "yes" ; then
|
|
|
115 |
ax_signed_right_shift=logical
|
|
|
116 |
AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 2,
|
|
|
117 |
[Indicates the effect of the right shift operator
|
|
|
118 |
on negative signed integers])
|
|
|
119 |
else
|
|
|
120 |
ax_signed_right_shift=unknown
|
|
|
121 |
AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 3,
|
|
|
122 |
[Indicates the effect of the right shift operator
|
|
|
123 |
on negative signed integers])
|
|
|
124 |
fi
|
|
|
125 |
|
|
|
126 |
AC_MSG_RESULT($ax_signed_right_shift)
|
|
|
127 |
])
|