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_logical" = "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) ])