2 * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
3 * See the copyright notice in the ACK home directory, in the file "Copyright".
5 /* $Id: ch3bin.c,v 1.7 1995/03/28 09:10:31 ceriel Exp $ */
6 /* EVALUATION OF BINARY OPERATORS */
11 #define arith_sign (1L << (sizeof(arith)*8-1))
13 ch3bin(pval, pis_uns, oper, val, is_uns)
14 register arith *pval, val;
15 int oper, is_uns, *pis_uns;
17 if (is_uns) *pis_uns = 1;
26 *pval /= (UNSIGNED_ARITH) val;
28 /* this is more of a problem than you might
29 think on C compilers which do not have
30 unsigned arith (== long (probably)).
32 if (val & arith_sign) {/* val > max_arith */
33 *pval = ! (*pval >= 0 || *pval < val);
34 /* this is the unsigned test
35 *pval < val for val > max_arith
38 else { /* val <= max_arith */
39 arith half, bit, hdiv, hrem, rem;
41 half = (*pval >> 1) & ~arith_sign;
43 /* now *pval == 2 * half + bit
50 *pval = 2 * hdiv + (rem < 0 || rem >= val);
51 /* that is the unsigned compare
52 rem >= val for val <= max_arith
68 *pval %= (UNSIGNED_ARITH) val;
70 if (val & arith_sign) {/* val > max_arith */
71 *pval = (*pval >= 0 || *pval < val) ? *pval : *pval - val;
72 /* this is the unsigned test
73 *pval < val for val > max_arith
76 else { /* val <= max_arith */
77 arith half, bit, hrem, rem;
79 half = (*pval >> 1) & ~arith_sign;
81 /* now *pval == 2 * half + bit
87 *pval = (rem < 0 || rem >= val) ? rem - val : rem;
105 *pval = *pval << val;
110 *pval = (*pval >> 1) & ~arith_sign;
111 *pval = *pval >> (val - 1);
113 else *pval = *pval >> val;
116 { arith tmp = *pval; *pval = val; val = tmp; }
120 #ifdef UNSIGNED_ARITH
121 *pval = (UNSIGNED_ARITH) *pval > (UNSIGNED_ARITH) val;
123 *pval = (*pval & arith_sign ?
124 (val & arith_sign ? *pval > val : 1) :
125 (val & arith_sign ? 0 : *pval > val)
129 else *pval = (*pval > val);
132 { arith tmp = *pval; *pval = val; val = tmp; }
136 #ifdef UNSIGNED_ARITH
137 *pval = (UNSIGNED_ARITH) *pval >= (UNSIGNED_ARITH) val;
139 *pval = (*pval & arith_sign ?
140 (val & arith_sign ? *pval >= val : 1) :
141 (val & arith_sign ? 0 : *pval >= val)
145 else *pval = (*pval >= val);
148 *pval = (*pval == val);
151 *pval = (*pval != val);
163 *pval = (*pval && val);
166 *pval = (*pval || val);