| dnl @synopsis AX_SIGNED_RIGHT_SHIFT | 
 | dnl | 
 | dnl Tests the behavior of a right shift on a negative signed int. | 
 | dnl | 
 | dnl This macro calls: | 
 | dnl   AC_DEFINE(SIGNED_RIGHT_SHIFT_IS) | 
 | dnl   AC_DEFINE(ARITHMETIC_RIGHT_SHIFT) | 
 | dnl   AC_DEFINE(LOGICAL_RIGHT_SHIFT) | 
 | dnl   AC_DEFINE(UNKNOWN_RIGHT_SHIFT) | 
 | dnl | 
 | dnl SIGNED_RIGHT_SHIFT_IS will be equal to one of the other macros. | 
 | dnl It also leaves the shell variables "ax_signed_right_shift" | 
 | dnl set to "arithmetic", "logical", or "unknown". | 
 | dnl | 
 | dnl NOTE: This macro does not work for cross-compiling. | 
 | dnl | 
 | dnl @category C | 
 | dnl @version 2009-03-25 | 
 | dnl @license AllPermissive | 
 | dnl | 
 | dnl Copyright (C) 2009 David Reiss | 
 | dnl Copying and distribution of this file, with or without modification, | 
 | dnl are permitted in any medium without royalty provided the copyright | 
 | dnl notice and this notice are preserved. | 
 |  | 
 | AC_DEFUN([AX_SIGNED_RIGHT_SHIFT], | 
 |          [ | 
 |  | 
 |           AC_MSG_CHECKING(the behavior of a signed right shift) | 
 |  | 
 |           success_arithmetic=no | 
 |           AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[ | 
 |           return | 
 |             /* 0xffffffff */ | 
 |             -1 >>  1 != -1 || | 
 |             -1 >>  2 != -1 || | 
 |             -1 >>  3 != -1 || | 
 |             -1 >>  4 != -1 || | 
 |             -1 >>  8 != -1 || | 
 |             -1 >> 16 != -1 || | 
 |             -1 >> 24 != -1 || | 
 |             -1 >> 31 != -1 || | 
 |             /* 0x80000000 */ | 
 |             (-2147483647 - 1) >>  1 != -1073741824 || | 
 |             (-2147483647 - 1) >>  2 != -536870912  || | 
 |             (-2147483647 - 1) >>  3 != -268435456  || | 
 |             (-2147483647 - 1) >>  4 != -134217728  || | 
 |             (-2147483647 - 1) >>  8 != -8388608    || | 
 |             (-2147483647 - 1) >> 16 != -32768      || | 
 |             (-2147483647 - 1) >> 24 != -128        || | 
 |             (-2147483647 - 1) >> 31 != -1          || | 
 |             /* 0x90800000 */ | 
 |             -1870659584 >>  1 != -935329792 || | 
 |             -1870659584 >>  2 != -467664896 || | 
 |             -1870659584 >>  3 != -233832448 || | 
 |             -1870659584 >>  4 != -116916224 || | 
 |             -1870659584 >>  8 != -7307264   || | 
 |             -1870659584 >> 16 != -28544     || | 
 |             -1870659584 >> 24 != -112       || | 
 |             -1870659584 >> 31 != -1         || | 
 |             0; | 
 |           ]])], [ | 
 |           success_arithmetic=yes | 
 |           ]) | 
 |  | 
 |  | 
 |           success_logical=no | 
 |           AC_RUN_IFELSE([AC_LANG_PROGRAM([[]], [[ | 
 |           return | 
 |             /* 0xffffffff */ | 
 |             -1 >>  1 != (signed)((unsigned)-1 >>  1) || | 
 |             -1 >>  2 != (signed)((unsigned)-1 >>  2) || | 
 |             -1 >>  3 != (signed)((unsigned)-1 >>  3) || | 
 |             -1 >>  4 != (signed)((unsigned)-1 >>  4) || | 
 |             -1 >>  8 != (signed)((unsigned)-1 >>  8) || | 
 |             -1 >> 16 != (signed)((unsigned)-1 >> 16) || | 
 |             -1 >> 24 != (signed)((unsigned)-1 >> 24) || | 
 |             -1 >> 31 != (signed)((unsigned)-1 >> 31) || | 
 |             /* 0x80000000 */ | 
 |             (-2147483647 - 1) >>  1 != (signed)((unsigned)(-2147483647 - 1) >>  1) || | 
 |             (-2147483647 - 1) >>  2 != (signed)((unsigned)(-2147483647 - 1) >>  2) || | 
 |             (-2147483647 - 1) >>  3 != (signed)((unsigned)(-2147483647 - 1) >>  3) || | 
 |             (-2147483647 - 1) >>  4 != (signed)((unsigned)(-2147483647 - 1) >>  4) || | 
 |             (-2147483647 - 1) >>  8 != (signed)((unsigned)(-2147483647 - 1) >>  8) || | 
 |             (-2147483647 - 1) >> 16 != (signed)((unsigned)(-2147483647 - 1) >> 16) || | 
 |             (-2147483647 - 1) >> 24 != (signed)((unsigned)(-2147483647 - 1) >> 24) || | 
 |             (-2147483647 - 1) >> 31 != (signed)((unsigned)(-2147483647 - 1) >> 31) || | 
 |             /* 0x90800000 */ | 
 |             -1870659584 >>  1 != (signed)((unsigned)-1870659584 >>  1) || | 
 |             -1870659584 >>  2 != (signed)((unsigned)-1870659584 >>  2) || | 
 |             -1870659584 >>  3 != (signed)((unsigned)-1870659584 >>  3) || | 
 |             -1870659584 >>  4 != (signed)((unsigned)-1870659584 >>  4) || | 
 |             -1870659584 >>  8 != (signed)((unsigned)-1870659584 >>  8) || | 
 |             -1870659584 >> 16 != (signed)((unsigned)-1870659584 >> 16) || | 
 |             -1870659584 >> 24 != (signed)((unsigned)-1870659584 >> 24) || | 
 |             -1870659584 >> 31 != (signed)((unsigned)-1870659584 >> 31) || | 
 |             0; | 
 |           ]])], [ | 
 |           success_logical=yes | 
 |           ]) | 
 |  | 
 |  | 
 |           AC_DEFINE([ARITHMETIC_RIGHT_SHIFT], 1, [Possible value for SIGNED_RIGHT_SHIFT_IS]) | 
 |           AC_DEFINE([LOGICAL_RIGHT_SHIFT], 2, [Possible value for SIGNED_RIGHT_SHIFT_IS]) | 
 |           AC_DEFINE([UNKNOWN_RIGHT_SHIFT], 3, [Possible value for SIGNED_RIGHT_SHIFT_IS]) | 
 |  | 
 |           if test "$success_arithmetic" = "yes" && test "$success_logica" = "yes" ; then | 
 |             AC_MSG_ERROR("Right shift appears to be both arithmetic and logical!") | 
 |           elif test "$success_arithmetic" = "yes" ; then | 
 |             ax_signed_right_shift=arithmetic | 
 |             AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 1, | 
 |                       [Indicates the effect of the right shift operator | 
 |                        on negative signed integers]) | 
 |           elif test "$success_logical" = "yes" ; then | 
 |             ax_signed_right_shift=logical | 
 |             AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 2, | 
 |                       [Indicates the effect of the right shift operator | 
 |                        on negative signed integers]) | 
 |           else | 
 |             ax_signed_right_shift=unknown | 
 |             AC_DEFINE([SIGNED_RIGHT_SHIFT_IS], 3, | 
 |                       [Indicates the effect of the right shift operator | 
 |                        on negative signed integers]) | 
 |           fi | 
 |  | 
 |           AC_MSG_RESULT($ax_signed_right_shift) | 
 |          ]) |