]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/valarith.c
* config/sh/tm-sh.h (BELIEVE_PCC_PROMOTION): Define, so that
[thirdparty/binutils-gdb.git] / gdb / valarith.c
CommitLineData
bd5635a1 1/* Perform arithmetic and other operations on values, for GDB.
dcda44a0
PB
2 Copyright 1986, 1989, 1991, 1992, 1993, 1994
3 Free Software Foundation, Inc.
bd5635a1
RP
4
5This file is part of GDB.
6
088c3a0b 7This program is free software; you can redistribute it and/or modify
bd5635a1 8it under the terms of the GNU General Public License as published by
088c3a0b
JG
9the Free Software Foundation; either version 2 of the License, or
10(at your option) any later version.
bd5635a1 11
088c3a0b 12This program is distributed in the hope that it will be useful,
bd5635a1
RP
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
088c3a0b 18along with this program; if not, write to the Free Software
bcbf388e 19Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */
088c3a0b 20
bd5635a1 21#include "defs.h"
bd5635a1 22#include "value.h"
088c3a0b 23#include "symtab.h"
51b57ded 24#include "gdbtypes.h"
bd5635a1
RP
25#include "expression.h"
26#include "target.h"
2fcc38b8 27#include "language.h"
eade0c6c 28#include "demangle.h"
2b576293 29#include "gdb_string.h"
bd5635a1 30
2fcc38b8
FF
31/* Define whether or not the C operator '/' truncates towards zero for
32 differently signed operands (truncation direction is undefined in C). */
33
34#ifndef TRUNCATION_TOWARDS_ZERO
35#define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
36#endif
37
2b576293 38static value_ptr value_subscripted_rvalue PARAMS ((value_ptr, value_ptr, int));
bd5635a1 39
088c3a0b 40\f
dcda44a0 41value_ptr
bd5635a1 42value_add (arg1, arg2)
dcda44a0 43 value_ptr arg1, arg2;
bd5635a1 44{
dcda44a0 45 register value_ptr valint, valptr;
bd5635a1 46 register int len;
bcbf388e 47 struct type *type1, *type2, *valptrtype;
bd5635a1 48
8d67b75a
PB
49 COERCE_NUMBER (arg1);
50 COERCE_NUMBER (arg2);
bcbf388e
PB
51 type1 = check_typedef (VALUE_TYPE (arg1));
52 type2 = check_typedef (VALUE_TYPE (arg2));
bd5635a1 53
bcbf388e
PB
54 if ((TYPE_CODE (type1) == TYPE_CODE_PTR
55 || TYPE_CODE (type2) == TYPE_CODE_PTR)
bd5635a1 56 &&
bcbf388e
PB
57 (TYPE_CODE (type1) == TYPE_CODE_INT
58 || TYPE_CODE (type2) == TYPE_CODE_INT))
bd5635a1
RP
59 /* Exactly one argument is a pointer, and one is an integer. */
60 {
bcbf388e 61 if (TYPE_CODE (type1) == TYPE_CODE_PTR)
bd5635a1
RP
62 {
63 valptr = arg1;
64 valint = arg2;
bcbf388e 65 valptrtype = type1;
bd5635a1
RP
66 }
67 else
68 {
69 valptr = arg2;
70 valint = arg1;
bcbf388e 71 valptrtype = type2;
bd5635a1 72 }
bcbf388e 73 len = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (valptrtype)));
bd5635a1 74 if (len == 0) len = 1; /* For (void *) */
bcbf388e 75 return value_from_longest (valptrtype,
088c3a0b
JG
76 value_as_long (valptr)
77 + (len * value_as_long (valint)));
bd5635a1
RP
78 }
79
80 return value_binop (arg1, arg2, BINOP_ADD);
81}
82
dcda44a0 83value_ptr
bd5635a1 84value_sub (arg1, arg2)
dcda44a0 85 value_ptr arg1, arg2;
bd5635a1 86{
bcbf388e 87 struct type *type1, *type2;
8d67b75a
PB
88 COERCE_NUMBER (arg1);
89 COERCE_NUMBER (arg2);
bcbf388e
PB
90 type1 = check_typedef (VALUE_TYPE (arg1));
91 type2 = check_typedef (VALUE_TYPE (arg2));
bd5635a1 92
bcbf388e 93 if (TYPE_CODE (type1) == TYPE_CODE_PTR)
bd5635a1 94 {
bcbf388e 95 if (TYPE_CODE (type2) == TYPE_CODE_INT)
bd5635a1
RP
96 {
97 /* pointer - integer. */
bcbf388e 98 LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));
088c3a0b
JG
99 return value_from_longest
100 (VALUE_TYPE (arg1),
bcbf388e 101 value_as_long (arg1) - (sz * value_as_long (arg2)));
bd5635a1 102 }
bcbf388e
PB
103 else if (TYPE_CODE (type2) == TYPE_CODE_PTR
104 && TYPE_LENGTH (TYPE_TARGET_TYPE (type1))
105 == TYPE_LENGTH (TYPE_TARGET_TYPE (type2)))
bd5635a1
RP
106 {
107 /* pointer to <type x> - pointer to <type x>. */
bcbf388e 108 LONGEST sz = TYPE_LENGTH (check_typedef (TYPE_TARGET_TYPE (type1)));
088c3a0b
JG
109 return value_from_longest
110 (builtin_type_long, /* FIXME -- should be ptrdiff_t */
bcbf388e 111 (value_as_long (arg1) - value_as_long (arg2)) / sz);
bd5635a1
RP
112 }
113 else
114 {
115 error ("\
116First argument of `-' is a pointer and second argument is neither\n\
117an integer nor a pointer of the same type.");
118 }
119 }
120
121 return value_binop (arg1, arg2, BINOP_SUB);
122}
123
fb6e675f
FF
124/* Return the value of ARRAY[IDX].
125 See comments in value_coerce_array() for rationale for reason for
126 doing lower bounds adjustment here rather than there.
127 FIXME: Perhaps we should validate that the index is valid and if
128 verbosity is set, warn about invalid indices (but still use them). */
bd5635a1 129
dcda44a0 130value_ptr
bd5635a1 131value_subscript (array, idx)
dcda44a0 132 value_ptr array, idx;
bd5635a1 133{
dcda44a0 134 value_ptr bound;
2b576293 135 int c_style = current_language->c_style_arrays;
b52cac6b 136 struct type *tarray;
fb6e675f 137
eade0c6c 138 COERCE_REF (array);
bcbf388e
PB
139 tarray = check_typedef (VALUE_TYPE (array));
140 COERCE_VARYING_ARRAY (array, tarray);
eade0c6c 141
bcbf388e
PB
142 if (TYPE_CODE (tarray) == TYPE_CODE_ARRAY
143 || TYPE_CODE (tarray) == TYPE_CODE_STRING)
fb6e675f 144 {
bcbf388e
PB
145 struct type *range_type = TYPE_INDEX_TYPE (tarray);
146 LONGEST lowerbound, upperbound;
147 get_discrete_bounds (range_type, &lowerbound, &upperbound);
2b576293
C
148
149 if (VALUE_LVAL (array) != lval_memory)
150 return value_subscripted_rvalue (array, idx, lowerbound);
151
152 if (c_style == 0)
153 {
154 LONGEST index = value_as_long (idx);
155 if (index >= lowerbound && index <= upperbound)
156 return value_subscripted_rvalue (array, idx, lowerbound);
157 warning ("array or string index out of range");
158 /* fall doing C stuff */
159 c_style = 1;
160 }
161
fb6e675f
FF
162 if (lowerbound != 0)
163 {
164 bound = value_from_longest (builtin_type_int, (LONGEST) lowerbound);
165 idx = value_sub (idx, bound);
166 }
2b576293 167
eade0c6c 168 array = value_coerce_array (array);
fb6e675f 169 }
bcbf388e
PB
170
171 if (TYPE_CODE (tarray) == TYPE_CODE_BITSTRING)
172 {
173 struct type *range_type = TYPE_INDEX_TYPE (tarray);
174 LONGEST index = value_as_long (idx);
175 value_ptr v;
176 int offset, byte, bit_index;
b52cac6b 177 LONGEST lowerbound, upperbound;
bcbf388e
PB
178 get_discrete_bounds (range_type, &lowerbound, &upperbound);
179 if (index < lowerbound || index > upperbound)
180 error ("bitstring index out of range");
181 index -= lowerbound;
182 offset = index / TARGET_CHAR_BIT;
183 byte = *((char*)VALUE_CONTENTS (array) + offset);
184 bit_index = index % TARGET_CHAR_BIT;
185 byte >>= (BITS_BIG_ENDIAN ? TARGET_CHAR_BIT - 1 - bit_index : bit_index);
8d67b75a 186 v = value_from_longest (LA_BOOL_TYPE, byte & 1);
bcbf388e
PB
187 VALUE_BITPOS (v) = bit_index;
188 VALUE_BITSIZE (v) = 1;
189 VALUE_LVAL (v) = VALUE_LVAL (array);
190 if (VALUE_LVAL (array) == lval_internalvar)
191 VALUE_LVAL (v) = lval_internalvar_component;
192 VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
193 VALUE_OFFSET (v) = offset + VALUE_OFFSET (array);
194 return v;
195 }
196
2b576293
C
197 if (c_style)
198 return value_ind (value_add (array, idx));
199 else
200 error ("not an array or string");
bd5635a1
RP
201}
202
203/* Return the value of EXPR[IDX], expr an aggregate rvalue
204 (eg, a vector register). This routine used to promote floats
205 to doubles, but no longer does. */
206
dcda44a0 207static value_ptr
2b576293 208value_subscripted_rvalue (array, idx, lowerbound)
dcda44a0 209 value_ptr array, idx;
2b576293 210 int lowerbound;
bd5635a1 211{
bcbf388e
PB
212 struct type *array_type = check_typedef (VALUE_TYPE (array));
213 struct type *elt_type = check_typedef (TYPE_TARGET_TYPE (array_type));
b52cac6b 214 unsigned int elt_size = TYPE_LENGTH (elt_type);
2b576293 215 LONGEST index = value_as_long (idx);
b52cac6b 216 unsigned int elt_offs = elt_size * longest_to_int (index - lowerbound);
dcda44a0 217 value_ptr v;
bd5635a1 218
bcbf388e 219 if (index < lowerbound || elt_offs >= TYPE_LENGTH (array_type))
bd5635a1
RP
220 error ("no such vector element");
221
222 v = allocate_value (elt_type);
2b576293
C
223 if (VALUE_LAZY (array))
224 VALUE_LAZY (v) = 1;
225 else
226 memcpy (VALUE_CONTENTS (v), VALUE_CONTENTS (array) + elt_offs, elt_size);
bd5635a1
RP
227
228 if (VALUE_LVAL (array) == lval_internalvar)
229 VALUE_LVAL (v) = lval_internalvar_component;
230 else
2b576293 231 VALUE_LVAL (v) = VALUE_LVAL (array);
bd5635a1
RP
232 VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
233 VALUE_OFFSET (v) = VALUE_OFFSET (array) + elt_offs;
bd5635a1
RP
234 return v;
235}
236\f
237/* Check to see if either argument is a structure. This is called so
238 we know whether to go ahead with the normal binop or look for a
239 user defined function instead.
240
241 For now, we do not overload the `=' operator. */
242
243int
244binop_user_defined_p (op, arg1, arg2)
245 enum exp_opcode op;
dcda44a0 246 value_ptr arg1, arg2;
bd5635a1 247{
bcbf388e 248 struct type *type1, *type2;
8d67b75a 249 if (op == BINOP_ASSIGN || op == BINOP_CONCAT)
bd5635a1 250 return 0;
bcbf388e
PB
251 type1 = check_typedef (VALUE_TYPE (arg1));
252 type2 = check_typedef (VALUE_TYPE (arg2));
253 return (TYPE_CODE (type1) == TYPE_CODE_STRUCT
254 || TYPE_CODE (type2) == TYPE_CODE_STRUCT
255 || (TYPE_CODE (type1) == TYPE_CODE_REF
256 && TYPE_CODE (TYPE_TARGET_TYPE (type1)) == TYPE_CODE_STRUCT)
257 || (TYPE_CODE (type2) == TYPE_CODE_REF
258 && TYPE_CODE (TYPE_TARGET_TYPE (type2)) == TYPE_CODE_STRUCT));
bd5635a1
RP
259}
260
261/* Check to see if argument is a structure. This is called so
262 we know whether to go ahead with the normal unop or look for a
263 user defined function instead.
264
265 For now, we do not overload the `&' operator. */
266
267int unop_user_defined_p (op, arg1)
268 enum exp_opcode op;
dcda44a0 269 value_ptr arg1;
bd5635a1 270{
bcbf388e 271 struct type *type1;
bd5635a1
RP
272 if (op == UNOP_ADDR)
273 return 0;
bcbf388e
PB
274 type1 = check_typedef (VALUE_TYPE (arg1));
275 for (;;)
276 {
277 if (TYPE_CODE (type1) == TYPE_CODE_STRUCT)
278 return 1;
279 else if (TYPE_CODE (type1) == TYPE_CODE_REF)
280 type1 = TYPE_TARGET_TYPE (type1);
281 else
282 return 0;
283 }
bd5635a1
RP
284}
285
286/* We know either arg1 or arg2 is a structure, so try to find the right
287 user defined function. Create an argument vector that calls
288 arg1.operator @ (arg1,arg2) and return that value (where '@' is any
088c3a0b
JG
289 binary operator which is legal for GNU C++).
290
291 OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP
292 is the opcode saying how to modify it. Otherwise, OTHEROP is
293 unused. */
bd5635a1 294
dcda44a0 295value_ptr
bd5635a1 296value_x_binop (arg1, arg2, op, otherop)
dcda44a0 297 value_ptr arg1, arg2;
bd5635a1
RP
298 enum exp_opcode op, otherop;
299{
dcda44a0
PB
300 value_ptr * argvec;
301 char *ptr;
302 char tstr[13];
bd5635a1
RP
303 int static_memfuncp;
304
088c3a0b
JG
305 COERCE_REF (arg1);
306 COERCE_REF (arg2);
bd5635a1
RP
307 COERCE_ENUM (arg1);
308 COERCE_ENUM (arg2);
309
310 /* now we know that what we have to do is construct our
311 arg vector and find the right function to call it with. */
312
bcbf388e 313 if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_STRUCT)
bd5635a1
RP
314 error ("Can't do that binary op on that type"); /* FIXME be explicit */
315
dcda44a0 316 argvec = (value_ptr *) alloca (sizeof (value_ptr) * 4);
bd5635a1
RP
317 argvec[1] = value_addr (arg1);
318 argvec[2] = arg2;
319 argvec[3] = 0;
320
321 /* make the right function name up */
322 strcpy(tstr, "operator__");
323 ptr = tstr+8;
324 switch (op)
325 {
e58de8a2
FF
326 case BINOP_ADD: strcpy(ptr,"+"); break;
327 case BINOP_SUB: strcpy(ptr,"-"); break;
328 case BINOP_MUL: strcpy(ptr,"*"); break;
329 case BINOP_DIV: strcpy(ptr,"/"); break;
330 case BINOP_REM: strcpy(ptr,"%"); break;
331 case BINOP_LSH: strcpy(ptr,"<<"); break;
332 case BINOP_RSH: strcpy(ptr,">>"); break;
333 case BINOP_BITWISE_AND: strcpy(ptr,"&"); break;
334 case BINOP_BITWISE_IOR: strcpy(ptr,"|"); break;
335 case BINOP_BITWISE_XOR: strcpy(ptr,"^"); break;
336 case BINOP_LOGICAL_AND: strcpy(ptr,"&&"); break;
337 case BINOP_LOGICAL_OR: strcpy(ptr,"||"); break;
338 case BINOP_MIN: strcpy(ptr,"<?"); break;
339 case BINOP_MAX: strcpy(ptr,">?"); break;
340 case BINOP_ASSIGN: strcpy(ptr,"="); break;
bd5635a1
RP
341 case BINOP_ASSIGN_MODIFY:
342 switch (otherop)
343 {
e58de8a2
FF
344 case BINOP_ADD: strcpy(ptr,"+="); break;
345 case BINOP_SUB: strcpy(ptr,"-="); break;
346 case BINOP_MUL: strcpy(ptr,"*="); break;
347 case BINOP_DIV: strcpy(ptr,"/="); break;
348 case BINOP_REM: strcpy(ptr,"%="); break;
349 case BINOP_BITWISE_AND: strcpy(ptr,"&="); break;
350 case BINOP_BITWISE_IOR: strcpy(ptr,"|="); break;
351 case BINOP_BITWISE_XOR: strcpy(ptr,"^="); break;
2fcc38b8 352 case BINOP_MOD: /* invalid */
bd5635a1
RP
353 default:
354 error ("Invalid binary operation specified.");
355 }
356 break;
357 case BINOP_SUBSCRIPT: strcpy(ptr,"[]"); break;
358 case BINOP_EQUAL: strcpy(ptr,"=="); break;
359 case BINOP_NOTEQUAL: strcpy(ptr,"!="); break;
360 case BINOP_LESS: strcpy(ptr,"<"); break;
361 case BINOP_GTR: strcpy(ptr,">"); break;
362 case BINOP_GEQ: strcpy(ptr,">="); break;
363 case BINOP_LEQ: strcpy(ptr,"<="); break;
2fcc38b8 364 case BINOP_MOD: /* invalid */
bd5635a1
RP
365 default:
366 error ("Invalid binary operation specified.");
367 }
eade0c6c 368
bd5635a1 369 argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
eade0c6c 370
bd5635a1
RP
371 if (argvec[0])
372 {
373 if (static_memfuncp)
374 {
375 argvec[1] = argvec[0];
376 argvec++;
377 }
e17960fb 378 return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
bd5635a1
RP
379 }
380 error ("member function %s not found", tstr);
381#ifdef lint
e17960fb 382 return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
bd5635a1
RP
383#endif
384}
385
386/* We know that arg1 is a structure, so try to find a unary user
387 defined operator that matches the operator in question.
388 Create an argument vector that calls arg1.operator @ (arg1)
389 and return that value (where '@' is (almost) any unary operator which
390 is legal for GNU C++). */
391
dcda44a0 392value_ptr
bd5635a1 393value_x_unop (arg1, op)
dcda44a0 394 value_ptr arg1;
bd5635a1
RP
395 enum exp_opcode op;
396{
dcda44a0 397 value_ptr * argvec;
eade0c6c
JK
398 char *ptr, *mangle_ptr;
399 char tstr[13], mangle_tstr[13];
bd5635a1
RP
400 int static_memfuncp;
401
8d67b75a 402 COERCE_REF (arg1);
bd5635a1
RP
403 COERCE_ENUM (arg1);
404
405 /* now we know that what we have to do is construct our
406 arg vector and find the right function to call it with. */
407
bcbf388e 408 if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_STRUCT)
bd5635a1
RP
409 error ("Can't do that unary op on that type"); /* FIXME be explicit */
410
dcda44a0 411 argvec = (value_ptr *) alloca (sizeof (value_ptr) * 3);
bd5635a1
RP
412 argvec[1] = value_addr (arg1);
413 argvec[2] = 0;
414
415 /* make the right function name up */
416 strcpy(tstr,"operator__");
417 ptr = tstr+8;
eade0c6c
JK
418 strcpy(mangle_tstr, "__");
419 mangle_ptr = mangle_tstr+2;
bd5635a1
RP
420 switch (op)
421 {
422 case UNOP_PREINCREMENT: strcpy(ptr,"++"); break;
423 case UNOP_PREDECREMENT: strcpy(ptr,"++"); break;
424 case UNOP_POSTINCREMENT: strcpy(ptr,"++"); break;
425 case UNOP_POSTDECREMENT: strcpy(ptr,"++"); break;
e58de8a2
FF
426 case UNOP_LOGICAL_NOT: strcpy(ptr,"!"); break;
427 case UNOP_COMPLEMENT: strcpy(ptr,"~"); break;
428 case UNOP_NEG: strcpy(ptr,"-"); break;
bd5635a1
RP
429 default:
430 error ("Invalid binary operation specified.");
431 }
eade0c6c 432
bd5635a1 433 argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
eade0c6c 434
bd5635a1
RP
435 if (argvec[0])
436 {
437 if (static_memfuncp)
438 {
439 argvec[1] = argvec[0];
440 argvec++;
441 }
e17960fb 442 return call_function_by_hand (argvec[0], 1 - static_memfuncp, argvec + 1);
bd5635a1
RP
443 }
444 error ("member function %s not found", tstr);
445 return 0; /* For lint -- never reached */
446}
2fcc38b8
FF
447
448\f
449/* Concatenate two values with the following conditions:
450
451 (1) Both values must be either bitstring values or character string
452 values and the resulting value consists of the concatenation of
453 ARG1 followed by ARG2.
454
455 or
456
457 One value must be an integer value and the other value must be
458 either a bitstring value or character string value, which is
459 to be repeated by the number of times specified by the integer
460 value.
461
462
463 (2) Boolean values are also allowed and are treated as bit string
464 values of length 1.
465
466 (3) Character values are also allowed and are treated as character
467 string values of length 1.
468*/
469
dcda44a0 470value_ptr
2fcc38b8 471value_concat (arg1, arg2)
dcda44a0 472 value_ptr arg1, arg2;
2fcc38b8 473{
dcda44a0 474 register value_ptr inval1, inval2, outval;
2fcc38b8
FF
475 int inval1len, inval2len;
476 int count, idx;
477 char *ptr;
478 char inchar;
bcbf388e
PB
479 struct type *type1 = check_typedef (VALUE_TYPE (arg1));
480 struct type *type2 = check_typedef (VALUE_TYPE (arg2));
2fcc38b8 481
8d67b75a
PB
482 COERCE_VARYING_ARRAY (arg1, type1);
483 COERCE_VARYING_ARRAY (arg2, type2);
484
2fcc38b8
FF
485 /* First figure out if we are dealing with two values to be concatenated
486 or a repeat count and a value to be repeated. INVAL1 is set to the
487 first of two concatenated values, or the repeat count. INVAL2 is set
488 to the second of the two concatenated values or the value to be
489 repeated. */
490
bcbf388e 491 if (TYPE_CODE (type2) == TYPE_CODE_INT)
2fcc38b8 492 {
bcbf388e
PB
493 struct type *tmp = type1;
494 type1 = tmp;
495 tmp = type2;
2fcc38b8
FF
496 inval1 = arg2;
497 inval2 = arg1;
498 }
499 else
500 {
501 inval1 = arg1;
502 inval2 = arg2;
503 }
504
505 /* Now process the input values. */
506
bcbf388e 507 if (TYPE_CODE (type1) == TYPE_CODE_INT)
2fcc38b8
FF
508 {
509 /* We have a repeat count. Validate the second value and then
510 construct a value repeated that many times. */
bcbf388e
PB
511 if (TYPE_CODE (type2) == TYPE_CODE_STRING
512 || TYPE_CODE (type2) == TYPE_CODE_CHAR)
2fcc38b8
FF
513 {
514 count = longest_to_int (value_as_long (inval1));
bcbf388e 515 inval2len = TYPE_LENGTH (type2);
2fcc38b8 516 ptr = (char *) alloca (count * inval2len);
bcbf388e 517 if (TYPE_CODE (type2) == TYPE_CODE_CHAR)
2fcc38b8 518 {
bcbf388e 519 inchar = (char) unpack_long (type2,
2fcc38b8
FF
520 VALUE_CONTENTS (inval2));
521 for (idx = 0; idx < count; idx++)
522 {
523 *(ptr + idx) = inchar;
524 }
525 }
526 else
527 {
528 for (idx = 0; idx < count; idx++)
529 {
530 memcpy (ptr + (idx * inval2len), VALUE_CONTENTS (inval2),
531 inval2len);
532 }
533 }
534 outval = value_string (ptr, count * inval2len);
535 }
bcbf388e
PB
536 else if (TYPE_CODE (type2) == TYPE_CODE_BITSTRING
537 || TYPE_CODE (type2) == TYPE_CODE_BOOL)
2fcc38b8
FF
538 {
539 error ("unimplemented support for bitstring/boolean repeats");
540 }
541 else
542 {
543 error ("can't repeat values of that type");
544 }
545 }
bcbf388e
PB
546 else if (TYPE_CODE (type1) == TYPE_CODE_STRING
547 || TYPE_CODE (type1) == TYPE_CODE_CHAR)
2fcc38b8
FF
548 {
549 /* We have two character strings to concatenate. */
bcbf388e
PB
550 if (TYPE_CODE (type2) != TYPE_CODE_STRING
551 && TYPE_CODE (type2) != TYPE_CODE_CHAR)
2fcc38b8
FF
552 {
553 error ("Strings can only be concatenated with other strings.");
554 }
bcbf388e
PB
555 inval1len = TYPE_LENGTH (type1);
556 inval2len = TYPE_LENGTH (type2);
2fcc38b8 557 ptr = (char *) alloca (inval1len + inval2len);
bcbf388e 558 if (TYPE_CODE (type1) == TYPE_CODE_CHAR)
2fcc38b8 559 {
bcbf388e 560 *ptr = (char) unpack_long (type1, VALUE_CONTENTS (inval1));
2fcc38b8
FF
561 }
562 else
563 {
564 memcpy (ptr, VALUE_CONTENTS (inval1), inval1len);
565 }
bcbf388e 566 if (TYPE_CODE (type2) == TYPE_CODE_CHAR)
2fcc38b8
FF
567 {
568 *(ptr + inval1len) =
bcbf388e 569 (char) unpack_long (type2, VALUE_CONTENTS (inval2));
2fcc38b8
FF
570 }
571 else
572 {
573 memcpy (ptr + inval1len, VALUE_CONTENTS (inval2), inval2len);
574 }
575 outval = value_string (ptr, inval1len + inval2len);
576 }
bcbf388e
PB
577 else if (TYPE_CODE (type1) == TYPE_CODE_BITSTRING
578 || TYPE_CODE (type1) == TYPE_CODE_BOOL)
2fcc38b8
FF
579 {
580 /* We have two bitstrings to concatenate. */
bcbf388e
PB
581 if (TYPE_CODE (type2) != TYPE_CODE_BITSTRING
582 && TYPE_CODE (type2) != TYPE_CODE_BOOL)
2fcc38b8
FF
583 {
584 error ("Bitstrings or booleans can only be concatenated with other bitstrings or booleans.");
585 }
586 error ("unimplemented support for bitstring/boolean concatenation.");
587 }
588 else
589 {
590 /* We don't know how to concatenate these operands. */
591 error ("illegal operands for concatenation.");
592 }
593 return (outval);
594}
595
bd5635a1 596\f
eade0c6c 597
2fcc38b8
FF
598/* Perform a binary operation on two operands which have reasonable
599 representations as integers or floats. This includes booleans,
600 characters, integers, or floats.
bd5635a1
RP
601 Does not support addition and subtraction on pointers;
602 use value_add or value_sub if you want to handle those possibilities. */
603
dcda44a0 604value_ptr
bd5635a1 605value_binop (arg1, arg2, op)
dcda44a0 606 value_ptr arg1, arg2;
088c3a0b 607 enum exp_opcode op;
bd5635a1 608{
dcda44a0 609 register value_ptr val;
bcbf388e 610 struct type *type1, *type2;
bd5635a1 611
8d67b75a
PB
612 COERCE_REF (arg1);
613 COERCE_REF (arg2);
bd5635a1
RP
614 COERCE_ENUM (arg1);
615 COERCE_ENUM (arg2);
bcbf388e
PB
616 type1 = check_typedef (VALUE_TYPE (arg1));
617 type2 = check_typedef (VALUE_TYPE (arg2));
618
619 if ((TYPE_CODE (type1) != TYPE_CODE_FLT
620 && TYPE_CODE (type1) != TYPE_CODE_CHAR
621 && TYPE_CODE (type1) != TYPE_CODE_INT
622 && TYPE_CODE (type1) != TYPE_CODE_BOOL
623 && TYPE_CODE (type1) != TYPE_CODE_RANGE)
bd5635a1 624 ||
bcbf388e
PB
625 (TYPE_CODE (type2) != TYPE_CODE_FLT
626 && TYPE_CODE (type2) != TYPE_CODE_CHAR
627 && TYPE_CODE (type2) != TYPE_CODE_INT
628 && TYPE_CODE (type2) != TYPE_CODE_BOOL
629 && TYPE_CODE (type2) != TYPE_CODE_RANGE))
e58de8a2 630 error ("Argument to arithmetic operation not a number or boolean.");
bd5635a1 631
bcbf388e 632 if (TYPE_CODE (type1) == TYPE_CODE_FLT
bd5635a1 633 ||
bcbf388e 634 TYPE_CODE (type2) == TYPE_CODE_FLT)
bd5635a1 635 {
eade0c6c
JK
636 /* FIXME-if-picky-about-floating-accuracy: Should be doing this
637 in target format. real.c in GCC probably has the necessary
638 code. */
8d67b75a 639 DOUBLEST v1, v2, v;
bd5635a1
RP
640 v1 = value_as_double (arg1);
641 v2 = value_as_double (arg2);
642 switch (op)
643 {
644 case BINOP_ADD:
645 v = v1 + v2;
646 break;
647
648 case BINOP_SUB:
649 v = v1 - v2;
650 break;
651
652 case BINOP_MUL:
653 v = v1 * v2;
654 break;
655
656 case BINOP_DIV:
657 v = v1 / v2;
658 break;
659
660 default:
661 error ("Integer-only operation on floating point number.");
662 }
663
8d67b75a
PB
664 /* If either arg was long double, make sure that value is also long
665 double. */
666
667 if (TYPE_LENGTH(type1) * 8 > TARGET_DOUBLE_BIT
668 || TYPE_LENGTH(type2) * 8 > TARGET_DOUBLE_BIT)
669 val = allocate_value (builtin_type_long_double);
670 else
671 val = allocate_value (builtin_type_double);
672
eade0c6c
JK
673 store_floating (VALUE_CONTENTS_RAW (val), TYPE_LENGTH (VALUE_TYPE (val)),
674 v);
bd5635a1 675 }
bcbf388e 676 else if (TYPE_CODE (type1) == TYPE_CODE_BOOL
e58de8a2 677 &&
bcbf388e 678 TYPE_CODE (type2) == TYPE_CODE_BOOL)
e58de8a2
FF
679 {
680 LONGEST v1, v2, v;
681 v1 = value_as_long (arg1);
682 v2 = value_as_long (arg2);
683
684 switch (op)
685 {
686 case BINOP_BITWISE_AND:
687 v = v1 & v2;
688 break;
689
690 case BINOP_BITWISE_IOR:
691 v = v1 | v2;
692 break;
693
694 case BINOP_BITWISE_XOR:
695 v = v1 ^ v2;
696 break;
697
698 default:
699 error ("Invalid operation on booleans.");
700 }
701
bcbf388e 702 val = allocate_value (type1);
eade0c6c 703 store_signed_integer (VALUE_CONTENTS_RAW (val),
bcbf388e 704 TYPE_LENGTH (type1),
eade0c6c 705 v);
e58de8a2 706 }
bd5635a1
RP
707 else
708 /* Integral operations here. */
e58de8a2 709 /* FIXME: Also mixed integral/booleans, with result an integer. */
dcda44a0
PB
710 /* FIXME: This implements ANSI C rules (also correct for C++).
711 What about FORTRAN and chill? */
bd5635a1 712 {
b52cac6b
FF
713 unsigned int promoted_len1 = TYPE_LENGTH (type1);
714 unsigned int promoted_len2 = TYPE_LENGTH (type2);
dcda44a0
PB
715 int is_unsigned1 = TYPE_UNSIGNED (type1);
716 int is_unsigned2 = TYPE_UNSIGNED (type2);
b52cac6b 717 unsigned int result_len;
dcda44a0
PB
718 int unsigned_operation;
719
720 /* Determine type length and signedness after promotion for
721 both operands. */
722 if (promoted_len1 < TYPE_LENGTH (builtin_type_int))
723 {
724 is_unsigned1 = 0;
725 promoted_len1 = TYPE_LENGTH (builtin_type_int);
726 }
727 if (promoted_len2 < TYPE_LENGTH (builtin_type_int))
728 {
729 is_unsigned2 = 0;
730 promoted_len2 = TYPE_LENGTH (builtin_type_int);
731 }
732
733 /* Determine type length of the result, and if the operation should
734 be done unsigned.
735 Use the signedness of the operand with the greater length.
736 If both operands are of equal length, use unsigned operation
737 if one of the operands is unsigned. */
738 if (promoted_len1 > promoted_len2)
739 {
740 unsigned_operation = is_unsigned1;
741 result_len = promoted_len1;
742 }
743 else if (promoted_len2 > promoted_len1)
744 {
745 unsigned_operation = is_unsigned2;
746 result_len = promoted_len2;
747 }
748 else
749 {
750 unsigned_operation = is_unsigned1 || is_unsigned2;
751 result_len = promoted_len1;
752 }
753
754 if (unsigned_operation)
bd5635a1
RP
755 {
756 unsigned LONGEST v1, v2, v;
757 v1 = (unsigned LONGEST) value_as_long (arg1);
758 v2 = (unsigned LONGEST) value_as_long (arg2);
dcda44a0
PB
759
760 /* Truncate values to the type length of the result. */
761 if (result_len < sizeof (unsigned LONGEST))
762 {
763 v1 &= ((LONGEST) 1 << HOST_CHAR_BIT * result_len) - 1;
764 v2 &= ((LONGEST) 1 << HOST_CHAR_BIT * result_len) - 1;
765 }
bd5635a1
RP
766
767 switch (op)
768 {
769 case BINOP_ADD:
770 v = v1 + v2;
771 break;
772
773 case BINOP_SUB:
774 v = v1 - v2;
775 break;
776
777 case BINOP_MUL:
778 v = v1 * v2;
779 break;
780
781 case BINOP_DIV:
782 v = v1 / v2;
783 break;
784
785 case BINOP_REM:
786 v = v1 % v2;
787 break;
788
2fcc38b8
FF
789 case BINOP_MOD:
790 /* Knuth 1.2.4, integer only. Note that unlike the C '%' op,
791 v1 mod 0 has a defined value, v1. */
2fcc38b8
FF
792 /* Chill specifies that v2 must be > 0, so check for that. */
793 if (current_language -> la_language == language_chill
794 && value_as_long (arg2) <= 0)
795 {
796 error ("Second operand of MOD must be greater than zero.");
797 }
2fcc38b8
FF
798 if (v2 == 0)
799 {
800 v = v1;
801 }
802 else
803 {
804 v = v1/v2;
805 /* Note floor(v1/v2) == v1/v2 for unsigned. */
806 v = v1 - (v2 * v);
807 }
808 break;
809
bd5635a1
RP
810 case BINOP_LSH:
811 v = v1 << v2;
812 break;
813
814 case BINOP_RSH:
815 v = v1 >> v2;
816 break;
817
e58de8a2 818 case BINOP_BITWISE_AND:
bd5635a1
RP
819 v = v1 & v2;
820 break;
821
e58de8a2 822 case BINOP_BITWISE_IOR:
bd5635a1
RP
823 v = v1 | v2;
824 break;
825
e58de8a2 826 case BINOP_BITWISE_XOR:
bd5635a1
RP
827 v = v1 ^ v2;
828 break;
829
e58de8a2 830 case BINOP_LOGICAL_AND:
bd5635a1
RP
831 v = v1 && v2;
832 break;
833
e58de8a2 834 case BINOP_LOGICAL_OR:
bd5635a1
RP
835 v = v1 || v2;
836 break;
837
838 case BINOP_MIN:
839 v = v1 < v2 ? v1 : v2;
840 break;
841
842 case BINOP_MAX:
843 v = v1 > v2 ? v1 : v2;
844 break;
dcda44a0
PB
845
846 case BINOP_EQUAL:
847 v = v1 == v2;
848 break;
849
850 case BINOP_LESS:
851 v = v1 < v2;
852 break;
bd5635a1
RP
853
854 default:
855 error ("Invalid binary operation on numbers.");
856 }
857
dcda44a0
PB
858 /* This is a kludge to get around the fact that we don't
859 know how to determine the result type from the types of
860 the operands. (I'm not really sure how much we feel the
861 need to duplicate the exact rules of the current
862 language. They can get really hairy. But not to do so
863 makes it hard to document just what we *do* do). */
864
865 /* Can't just call init_type because we wouldn't know what
866 name to give the type. */
867 val = allocate_value
868 (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT
869 ? builtin_type_unsigned_long_long
870 : builtin_type_unsigned_long);
eade0c6c
JK
871 store_unsigned_integer (VALUE_CONTENTS_RAW (val),
872 TYPE_LENGTH (VALUE_TYPE (val)),
873 v);
bd5635a1
RP
874 }
875 else
876 {
877 LONGEST v1, v2, v;
878 v1 = value_as_long (arg1);
879 v2 = value_as_long (arg2);
880
881 switch (op)
882 {
883 case BINOP_ADD:
884 v = v1 + v2;
885 break;
886
887 case BINOP_SUB:
888 v = v1 - v2;
889 break;
890
891 case BINOP_MUL:
892 v = v1 * v2;
893 break;
894
895 case BINOP_DIV:
896 v = v1 / v2;
897 break;
898
899 case BINOP_REM:
900 v = v1 % v2;
901 break;
902
2fcc38b8
FF
903 case BINOP_MOD:
904 /* Knuth 1.2.4, integer only. Note that unlike the C '%' op,
905 X mod 0 has a defined value, X. */
2fcc38b8
FF
906 /* Chill specifies that v2 must be > 0, so check for that. */
907 if (current_language -> la_language == language_chill
908 && v2 <= 0)
909 {
910 error ("Second operand of MOD must be greater than zero.");
911 }
2fcc38b8
FF
912 if (v2 == 0)
913 {
914 v = v1;
915 }
916 else
917 {
918 v = v1/v2;
919 /* Compute floor. */
920 if (TRUNCATION_TOWARDS_ZERO && (v < 0) && ((v1 % v2) != 0))
921 {
922 v--;
923 }
924 v = v1 - (v2 * v);
925 }
926 break;
927
bd5635a1
RP
928 case BINOP_LSH:
929 v = v1 << v2;
930 break;
931
932 case BINOP_RSH:
933 v = v1 >> v2;
934 break;
935
e58de8a2 936 case BINOP_BITWISE_AND:
bd5635a1
RP
937 v = v1 & v2;
938 break;
939
e58de8a2 940 case BINOP_BITWISE_IOR:
bd5635a1
RP
941 v = v1 | v2;
942 break;
943
e58de8a2 944 case BINOP_BITWISE_XOR:
bd5635a1
RP
945 v = v1 ^ v2;
946 break;
947
e58de8a2 948 case BINOP_LOGICAL_AND:
bd5635a1
RP
949 v = v1 && v2;
950 break;
951
e58de8a2 952 case BINOP_LOGICAL_OR:
bd5635a1
RP
953 v = v1 || v2;
954 break;
955
956 case BINOP_MIN:
957 v = v1 < v2 ? v1 : v2;
958 break;
959
960 case BINOP_MAX:
961 v = v1 > v2 ? v1 : v2;
962 break;
dcda44a0
PB
963
964 case BINOP_EQUAL:
965 v = v1 == v2;
966 break;
967
968 case BINOP_LESS:
969 v = v1 < v2;
970 break;
bd5635a1
RP
971
972 default:
973 error ("Invalid binary operation on numbers.");
974 }
dcda44a0
PB
975
976 /* This is a kludge to get around the fact that we don't
977 know how to determine the result type from the types of
978 the operands. (I'm not really sure how much we feel the
979 need to duplicate the exact rules of the current
980 language. They can get really hairy. But not to do so
981 makes it hard to document just what we *do* do). */
982
983 /* Can't just call init_type because we wouldn't know what
984 name to give the type. */
985 val = allocate_value
986 (result_len > TARGET_LONG_BIT / HOST_CHAR_BIT
987 ? builtin_type_long_long
988 : builtin_type_long);
eade0c6c
JK
989 store_signed_integer (VALUE_CONTENTS_RAW (val),
990 TYPE_LENGTH (VALUE_TYPE (val)),
991 v);
bd5635a1
RP
992 }
993 }
994
995 return val;
996}
997\f
51b57ded 998/* Simulate the C operator ! -- return 1 if ARG1 contains zero. */
bd5635a1
RP
999
1000int
e58de8a2 1001value_logical_not (arg1)
dcda44a0 1002 value_ptr arg1;
bd5635a1
RP
1003{
1004 register int len;
1005 register char *p;
bcbf388e 1006 struct type *type1;
bd5635a1 1007
8d67b75a 1008 COERCE_NUMBER (arg1);
bcbf388e 1009 type1 = check_typedef (VALUE_TYPE (arg1));
bd5635a1 1010
bcbf388e 1011 if (TYPE_CODE (type1) == TYPE_CODE_FLT)
51b57ded
FF
1012 return 0 == value_as_double (arg1);
1013
bcbf388e 1014 len = TYPE_LENGTH (type1);
bd5635a1
RP
1015 p = VALUE_CONTENTS (arg1);
1016
1017 while (--len >= 0)
1018 {
1019 if (*p++)
1020 break;
1021 }
1022
1023 return len < 0;
1024}
1025
1026/* Simulate the C operator == by returning a 1
1027 iff ARG1 and ARG2 have equal contents. */
1028
1029int
1030value_equal (arg1, arg2)
dcda44a0 1031 register value_ptr arg1, arg2;
bd5635a1
RP
1032
1033{
1034 register int len;
1035 register char *p1, *p2;
bcbf388e 1036 struct type *type1, *type2;
bd5635a1
RP
1037 enum type_code code1;
1038 enum type_code code2;
1039
8d67b75a
PB
1040 COERCE_NUMBER (arg1);
1041 COERCE_NUMBER (arg2);
bd5635a1 1042
bcbf388e
PB
1043 type1 = check_typedef (VALUE_TYPE (arg1));
1044 type2 = check_typedef (VALUE_TYPE (arg2));
1045 code1 = TYPE_CODE (type1);
1046 code2 = TYPE_CODE (type2);
bd5635a1
RP
1047
1048 if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
dcda44a0
PB
1049 return longest_to_int (value_as_long (value_binop (arg1, arg2,
1050 BINOP_EQUAL)));
bd5635a1
RP
1051 else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
1052 && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
1053 return value_as_double (arg1) == value_as_double (arg2);
088c3a0b
JG
1054
1055 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
1056 is bigger. */
1057 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
1058 return value_as_pointer (arg1) == (CORE_ADDR) value_as_long (arg2);
1059 else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
1060 return (CORE_ADDR) value_as_long (arg1) == value_as_pointer (arg2);
1061
bd5635a1 1062 else if (code1 == code2
b52cac6b
FF
1063 && ((len = (int) TYPE_LENGTH (type1))
1064 == (int) TYPE_LENGTH (type2)))
bd5635a1
RP
1065 {
1066 p1 = VALUE_CONTENTS (arg1);
1067 p2 = VALUE_CONTENTS (arg2);
1068 while (--len >= 0)
1069 {
1070 if (*p1++ != *p2++)
1071 break;
1072 }
1073 return len < 0;
1074 }
1075 else
1076 {
1077 error ("Invalid type combination in equality test.");
1078 return 0; /* For lint -- never reached */
1079 }
1080}
1081
1082/* Simulate the C operator < by returning 1
1083 iff ARG1's contents are less than ARG2's. */
1084
1085int
1086value_less (arg1, arg2)
dcda44a0 1087 register value_ptr arg1, arg2;
bd5635a1
RP
1088{
1089 register enum type_code code1;
1090 register enum type_code code2;
bcbf388e 1091 struct type *type1, *type2;
bd5635a1 1092
8d67b75a
PB
1093 COERCE_NUMBER (arg1);
1094 COERCE_NUMBER (arg2);
bd5635a1 1095
bcbf388e
PB
1096 type1 = check_typedef (VALUE_TYPE (arg1));
1097 type2 = check_typedef (VALUE_TYPE (arg2));
1098 code1 = TYPE_CODE (type1);
1099 code2 = TYPE_CODE (type2);
bd5635a1
RP
1100
1101 if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
dcda44a0
PB
1102 return longest_to_int (value_as_long (value_binop (arg1, arg2,
1103 BINOP_LESS)));
bd5635a1
RP
1104 else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
1105 && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
1106 return value_as_double (arg1) < value_as_double (arg2);
088c3a0b
JG
1107 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_PTR)
1108 return value_as_pointer (arg1) < value_as_pointer (arg2);
1109
1110 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
1111 is bigger. */
1112 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
1113 return value_as_pointer (arg1) < (CORE_ADDR) value_as_long (arg2);
1114 else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
1115 return (CORE_ADDR) value_as_long (arg1) < value_as_pointer (arg2);
1116
bd5635a1
RP
1117 else
1118 {
1119 error ("Invalid type combination in ordering comparison.");
1120 return 0;
1121 }
1122}
1123\f
1124/* The unary operators - and ~. Both free the argument ARG1. */
1125
dcda44a0 1126value_ptr
bd5635a1 1127value_neg (arg1)
dcda44a0 1128 register value_ptr arg1;
bd5635a1
RP
1129{
1130 register struct type *type;
1131
8d67b75a 1132 COERCE_REF (arg1);
bd5635a1
RP
1133 COERCE_ENUM (arg1);
1134
bcbf388e 1135 type = check_typedef (VALUE_TYPE (arg1));
bd5635a1
RP
1136
1137 if (TYPE_CODE (type) == TYPE_CODE_FLT)
1138 return value_from_double (type, - value_as_double (arg1));
1139 else if (TYPE_CODE (type) == TYPE_CODE_INT)
088c3a0b 1140 return value_from_longest (type, - value_as_long (arg1));
bd5635a1
RP
1141 else {
1142 error ("Argument to negate operation not a number.");
1143 return 0; /* For lint -- never reached */
1144 }
1145}
1146
dcda44a0 1147value_ptr
e58de8a2 1148value_complement (arg1)
dcda44a0 1149 register value_ptr arg1;
bd5635a1 1150{
8d67b75a 1151 COERCE_REF (arg1);
bd5635a1
RP
1152 COERCE_ENUM (arg1);
1153
bcbf388e 1154 if (TYPE_CODE (check_typedef (VALUE_TYPE (arg1))) != TYPE_CODE_INT)
bd5635a1
RP
1155 error ("Argument to complement operation not an integer.");
1156
088c3a0b 1157 return value_from_longest (VALUE_TYPE (arg1), ~ value_as_long (arg1));
bd5635a1
RP
1158}
1159\f
eade0c6c
JK
1160/* The INDEX'th bit of SET value whose VALUE_TYPE is TYPE,
1161 and whose VALUE_CONTENTS is valaddr.
1162 Return -1 if out of range, -2 other error. */
1163
1164int
1165value_bit_index (type, valaddr, index)
1166 struct type *type;
1167 char *valaddr;
1168 int index;
1169{
bcbf388e 1170 LONGEST low_bound, high_bound;
eade0c6c 1171 LONGEST word;
dcda44a0 1172 unsigned rel_index;
bcbf388e
PB
1173 struct type *range = TYPE_FIELD_TYPE (type, 0);
1174 if (get_discrete_bounds (range, &low_bound, &high_bound) < 0)
eade0c6c 1175 return -2;
eade0c6c
JK
1176 if (index < low_bound || index > high_bound)
1177 return -1;
dcda44a0
PB
1178 rel_index = index - low_bound;
1179 word = unpack_long (builtin_type_unsigned_char,
1180 valaddr + (rel_index / TARGET_CHAR_BIT));
1181 rel_index %= TARGET_CHAR_BIT;
1182 if (BITS_BIG_ENDIAN)
1183 rel_index = TARGET_CHAR_BIT - 1 - rel_index;
1184 return (word >> rel_index) & 1;
eade0c6c
JK
1185}
1186
dcda44a0 1187value_ptr
eade0c6c 1188value_in (element, set)
dcda44a0 1189 value_ptr element, set;
eade0c6c
JK
1190{
1191 int member;
bcbf388e
PB
1192 struct type *settype = check_typedef (VALUE_TYPE (set));
1193 struct type *eltype = check_typedef (VALUE_TYPE (element));
c105168f
WM
1194 if (TYPE_CODE (eltype) == TYPE_CODE_RANGE)
1195 eltype = TYPE_TARGET_TYPE (eltype);
bcbf388e 1196 if (TYPE_CODE (settype) != TYPE_CODE_SET)
eade0c6c 1197 error ("Second argument of 'IN' has wrong type");
bcbf388e
PB
1198 if (TYPE_CODE (eltype) != TYPE_CODE_INT
1199 && TYPE_CODE (eltype) != TYPE_CODE_CHAR
1200 && TYPE_CODE (eltype) != TYPE_CODE_ENUM
1201 && TYPE_CODE (eltype) != TYPE_CODE_BOOL)
eade0c6c 1202 error ("First argument of 'IN' has wrong type");
bcbf388e 1203 member = value_bit_index (settype, VALUE_CONTENTS (set),
eade0c6c
JK
1204 value_as_long (element));
1205 if (member < 0)
1206 error ("First argument of 'IN' not in range");
b52cac6b 1207 return value_from_longest (LA_BOOL_TYPE, member);
eade0c6c
JK
1208}
1209
1210void
1211_initialize_valarith ()
1212{
eade0c6c 1213}