Subversion Repositories SmartDukaan

Rev

Rev 30 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
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
         ])