* remote.c, remote-utils.c: Use SERIAL_FLUSH_INPUT after opening it.
[deliverable/binutils-gdb.git] / gdb / valarith.c
1 /* Perform arithmetic and other operations on values, for GDB.
2 Copyright 1986, 1989, 1991, 1992 Free Software Foundation, Inc.
3
4 This file is part of GDB.
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; if not, write to the Free Software
18 Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */
19
20 #include "defs.h"
21 #include "value.h"
22 #include "symtab.h"
23 #include "gdbtypes.h"
24 #include "expression.h"
25 #include "target.h"
26 #include "language.h"
27 #include <string.h>
28
29 /* Define whether or not the C operator '/' truncates towards zero for
30 differently signed operands (truncation direction is undefined in C). */
31
32 #ifndef TRUNCATION_TOWARDS_ZERO
33 #define TRUNCATION_TOWARDS_ZERO ((-5 / 2) == -2)
34 #endif
35
36 static value
37 value_subscripted_rvalue PARAMS ((value, value));
38
39 \f
40 value
41 value_add (arg1, arg2)
42 value arg1, arg2;
43 {
44 register value valint, valptr;
45 register int len;
46
47 COERCE_ARRAY (arg1);
48 COERCE_ARRAY (arg2);
49
50 if ((TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR
51 || TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_PTR)
52 &&
53 (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_INT
54 || TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_INT))
55 /* Exactly one argument is a pointer, and one is an integer. */
56 {
57 if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR)
58 {
59 valptr = arg1;
60 valint = arg2;
61 }
62 else
63 {
64 valptr = arg2;
65 valint = arg1;
66 }
67 len = TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (valptr)));
68 if (len == 0) len = 1; /* For (void *) */
69 return value_from_longest (VALUE_TYPE (valptr),
70 value_as_long (valptr)
71 + (len * value_as_long (valint)));
72 }
73
74 return value_binop (arg1, arg2, BINOP_ADD);
75 }
76
77 value
78 value_sub (arg1, arg2)
79 value arg1, arg2;
80 {
81
82 COERCE_ARRAY (arg1);
83 COERCE_ARRAY (arg2);
84
85 if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_PTR)
86 {
87 if (TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_INT)
88 {
89 /* pointer - integer. */
90 return value_from_longest
91 (VALUE_TYPE (arg1),
92 value_as_long (arg1)
93 - (TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1)))
94 * value_as_long (arg2)));
95 }
96 else if (VALUE_TYPE (arg1) == VALUE_TYPE (arg2))
97 {
98 /* pointer to <type x> - pointer to <type x>. */
99 return value_from_longest
100 (builtin_type_long, /* FIXME -- should be ptrdiff_t */
101 (value_as_long (arg1) - value_as_long (arg2))
102 / TYPE_LENGTH (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))));
103 }
104 else
105 {
106 error ("\
107 First argument of `-' is a pointer and second argument is neither\n\
108 an integer nor a pointer of the same type.");
109 }
110 }
111
112 return value_binop (arg1, arg2, BINOP_SUB);
113 }
114
115 /* Return the value of ARRAY[IDX].
116 See comments in value_coerce_array() for rationale for reason for
117 doing lower bounds adjustment here rather than there.
118 FIXME: Perhaps we should validate that the index is valid and if
119 verbosity is set, warn about invalid indices (but still use them). */
120
121 value
122 value_subscript (array, idx)
123 value array, idx;
124 {
125 int lowerbound;
126 value bound;
127 struct type *range_type;
128
129 if (TYPE_CODE (VALUE_TYPE (array)) == TYPE_CODE_ARRAY)
130 {
131 range_type = TYPE_FIELD_TYPE (VALUE_TYPE (array), 0);
132 lowerbound = TYPE_FIELD_BITPOS (range_type, 0);
133 if (lowerbound != 0)
134 {
135 bound = value_from_longest (builtin_type_int, (LONGEST) lowerbound);
136 idx = value_sub (idx, bound);
137 }
138 if (VALUE_LVAL (array) != lval_memory)
139 {
140 return value_subscripted_rvalue (array, idx);
141 }
142 }
143 return value_ind (value_add (array, idx));
144 }
145
146 /* Return the value of EXPR[IDX], expr an aggregate rvalue
147 (eg, a vector register). This routine used to promote floats
148 to doubles, but no longer does. */
149
150 static value
151 value_subscripted_rvalue (array, idx)
152 value array, idx;
153 {
154 struct type *elt_type = TYPE_TARGET_TYPE (VALUE_TYPE (array));
155 int elt_size = TYPE_LENGTH (elt_type);
156 int elt_offs = elt_size * longest_to_int (value_as_long (idx));
157 value v;
158
159 if (elt_offs >= TYPE_LENGTH (VALUE_TYPE (array)))
160 error ("no such vector element");
161
162 v = allocate_value (elt_type);
163 memcpy (VALUE_CONTENTS (v), VALUE_CONTENTS (array) + elt_offs, elt_size);
164
165 if (VALUE_LVAL (array) == lval_internalvar)
166 VALUE_LVAL (v) = lval_internalvar_component;
167 else
168 VALUE_LVAL (v) = not_lval;
169 VALUE_ADDRESS (v) = VALUE_ADDRESS (array);
170 VALUE_OFFSET (v) = VALUE_OFFSET (array) + elt_offs;
171 VALUE_BITSIZE (v) = elt_size * 8;
172 return v;
173 }
174 \f
175 /* Check to see if either argument is a structure. This is called so
176 we know whether to go ahead with the normal binop or look for a
177 user defined function instead.
178
179 For now, we do not overload the `=' operator. */
180
181 int
182 binop_user_defined_p (op, arg1, arg2)
183 enum exp_opcode op;
184 value arg1, arg2;
185 {
186 if (op == BINOP_ASSIGN)
187 return 0;
188 return (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_STRUCT
189 || TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_STRUCT
190 || (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_REF
191 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))) == TYPE_CODE_STRUCT)
192 || (TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_REF
193 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg2))) == TYPE_CODE_STRUCT));
194 }
195
196 /* Check to see if argument is a structure. This is called so
197 we know whether to go ahead with the normal unop or look for a
198 user defined function instead.
199
200 For now, we do not overload the `&' operator. */
201
202 int unop_user_defined_p (op, arg1)
203 enum exp_opcode op;
204 value arg1;
205 {
206 if (op == UNOP_ADDR)
207 return 0;
208 return (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_STRUCT
209 || (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_REF
210 && TYPE_CODE (TYPE_TARGET_TYPE (VALUE_TYPE (arg1))) == TYPE_CODE_STRUCT));
211 }
212
213 /* We know either arg1 or arg2 is a structure, so try to find the right
214 user defined function. Create an argument vector that calls
215 arg1.operator @ (arg1,arg2) and return that value (where '@' is any
216 binary operator which is legal for GNU C++).
217
218 OP is the operatore, and if it is BINOP_ASSIGN_MODIFY, then OTHEROP
219 is the opcode saying how to modify it. Otherwise, OTHEROP is
220 unused. */
221
222 value
223 value_x_binop (arg1, arg2, op, otherop)
224 value arg1, arg2;
225 enum exp_opcode op, otherop;
226 {
227 value * argvec;
228 char *ptr;
229 char tstr[13];
230 int static_memfuncp;
231
232 COERCE_REF (arg1);
233 COERCE_REF (arg2);
234 COERCE_ENUM (arg1);
235 COERCE_ENUM (arg2);
236
237 /* now we know that what we have to do is construct our
238 arg vector and find the right function to call it with. */
239
240 if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_STRUCT)
241 error ("Can't do that binary op on that type"); /* FIXME be explicit */
242
243 argvec = (value *) alloca (sizeof (value) * 4);
244 argvec[1] = value_addr (arg1);
245 argvec[2] = arg2;
246 argvec[3] = 0;
247
248 /* make the right function name up */
249 strcpy(tstr, "operator__");
250 ptr = tstr+8;
251 switch (op)
252 {
253 case BINOP_ADD: strcpy(ptr,"+"); break;
254 case BINOP_SUB: strcpy(ptr,"-"); break;
255 case BINOP_MUL: strcpy(ptr,"*"); break;
256 case BINOP_DIV: strcpy(ptr,"/"); break;
257 case BINOP_REM: strcpy(ptr,"%"); break;
258 case BINOP_LSH: strcpy(ptr,"<<"); break;
259 case BINOP_RSH: strcpy(ptr,">>"); break;
260 case BINOP_BITWISE_AND: strcpy(ptr,"&"); break;
261 case BINOP_BITWISE_IOR: strcpy(ptr,"|"); break;
262 case BINOP_BITWISE_XOR: strcpy(ptr,"^"); break;
263 case BINOP_LOGICAL_AND: strcpy(ptr,"&&"); break;
264 case BINOP_LOGICAL_OR: strcpy(ptr,"||"); break;
265 case BINOP_MIN: strcpy(ptr,"<?"); break;
266 case BINOP_MAX: strcpy(ptr,">?"); break;
267 case BINOP_ASSIGN: strcpy(ptr,"="); break;
268 case BINOP_ASSIGN_MODIFY:
269 switch (otherop)
270 {
271 case BINOP_ADD: strcpy(ptr,"+="); break;
272 case BINOP_SUB: strcpy(ptr,"-="); break;
273 case BINOP_MUL: strcpy(ptr,"*="); break;
274 case BINOP_DIV: strcpy(ptr,"/="); break;
275 case BINOP_REM: strcpy(ptr,"%="); break;
276 case BINOP_BITWISE_AND: strcpy(ptr,"&="); break;
277 case BINOP_BITWISE_IOR: strcpy(ptr,"|="); break;
278 case BINOP_BITWISE_XOR: strcpy(ptr,"^="); break;
279 case BINOP_MOD: /* invalid */
280 default:
281 error ("Invalid binary operation specified.");
282 }
283 break;
284 case BINOP_SUBSCRIPT: strcpy(ptr,"[]"); break;
285 case BINOP_EQUAL: strcpy(ptr,"=="); break;
286 case BINOP_NOTEQUAL: strcpy(ptr,"!="); break;
287 case BINOP_LESS: strcpy(ptr,"<"); break;
288 case BINOP_GTR: strcpy(ptr,">"); break;
289 case BINOP_GEQ: strcpy(ptr,">="); break;
290 case BINOP_LEQ: strcpy(ptr,"<="); break;
291 case BINOP_MOD: /* invalid */
292 default:
293 error ("Invalid binary operation specified.");
294 }
295 argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
296 if (argvec[0])
297 {
298 if (static_memfuncp)
299 {
300 argvec[1] = argvec[0];
301 argvec++;
302 }
303 return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
304 }
305 error ("member function %s not found", tstr);
306 #ifdef lint
307 return call_function_by_hand (argvec[0], 2 - static_memfuncp, argvec + 1);
308 #endif
309 }
310
311 /* We know that arg1 is a structure, so try to find a unary user
312 defined operator that matches the operator in question.
313 Create an argument vector that calls arg1.operator @ (arg1)
314 and return that value (where '@' is (almost) any unary operator which
315 is legal for GNU C++). */
316
317 value
318 value_x_unop (arg1, op)
319 value arg1;
320 enum exp_opcode op;
321 {
322 value * argvec;
323 char *ptr;
324 char tstr[13];
325 int static_memfuncp;
326
327 COERCE_ENUM (arg1);
328
329 /* now we know that what we have to do is construct our
330 arg vector and find the right function to call it with. */
331
332 if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_STRUCT)
333 error ("Can't do that unary op on that type"); /* FIXME be explicit */
334
335 argvec = (value *) alloca (sizeof (value) * 3);
336 argvec[1] = value_addr (arg1);
337 argvec[2] = 0;
338
339 /* make the right function name up */
340 strcpy(tstr,"operator__");
341 ptr = tstr+8;
342 switch (op)
343 {
344 case UNOP_PREINCREMENT: strcpy(ptr,"++"); break;
345 case UNOP_PREDECREMENT: strcpy(ptr,"++"); break;
346 case UNOP_POSTINCREMENT: strcpy(ptr,"++"); break;
347 case UNOP_POSTDECREMENT: strcpy(ptr,"++"); break;
348 case UNOP_LOGICAL_NOT: strcpy(ptr,"!"); break;
349 case UNOP_COMPLEMENT: strcpy(ptr,"~"); break;
350 case UNOP_NEG: strcpy(ptr,"-"); break;
351 default:
352 error ("Invalid binary operation specified.");
353 }
354 argvec[0] = value_struct_elt (&arg1, argvec+1, tstr, &static_memfuncp, "structure");
355 if (argvec[0])
356 {
357 if (static_memfuncp)
358 {
359 argvec[1] = argvec[0];
360 argvec++;
361 }
362 return call_function_by_hand (argvec[0], 1 - static_memfuncp, argvec + 1);
363 }
364 error ("member function %s not found", tstr);
365 return 0; /* For lint -- never reached */
366 }
367
368 \f
369 /* Concatenate two values with the following conditions:
370
371 (1) Both values must be either bitstring values or character string
372 values and the resulting value consists of the concatenation of
373 ARG1 followed by ARG2.
374
375 or
376
377 One value must be an integer value and the other value must be
378 either a bitstring value or character string value, which is
379 to be repeated by the number of times specified by the integer
380 value.
381
382
383 (2) Boolean values are also allowed and are treated as bit string
384 values of length 1.
385
386 (3) Character values are also allowed and are treated as character
387 string values of length 1.
388 */
389
390 value
391 value_concat (arg1, arg2)
392 value arg1, arg2;
393 {
394 register value inval1, inval2, outval;
395 int inval1len, inval2len;
396 int count, idx;
397 char *ptr;
398 char inchar;
399
400 /* First figure out if we are dealing with two values to be concatenated
401 or a repeat count and a value to be repeated. INVAL1 is set to the
402 first of two concatenated values, or the repeat count. INVAL2 is set
403 to the second of the two concatenated values or the value to be
404 repeated. */
405
406 if (TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_INT)
407 {
408 inval1 = arg2;
409 inval2 = arg1;
410 }
411 else
412 {
413 inval1 = arg1;
414 inval2 = arg2;
415 }
416
417 /* Now process the input values. */
418
419 if (TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_INT)
420 {
421 /* We have a repeat count. Validate the second value and then
422 construct a value repeated that many times. */
423 if (TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_STRING
424 || TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_CHAR)
425 {
426 count = longest_to_int (value_as_long (inval1));
427 inval2len = TYPE_LENGTH (VALUE_TYPE (inval2));
428 ptr = (char *) alloca (count * inval2len);
429 if (TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_CHAR)
430 {
431 inchar = (char) unpack_long (VALUE_TYPE (inval2),
432 VALUE_CONTENTS (inval2));
433 for (idx = 0; idx < count; idx++)
434 {
435 *(ptr + idx) = inchar;
436 }
437 }
438 else
439 {
440 for (idx = 0; idx < count; idx++)
441 {
442 memcpy (ptr + (idx * inval2len), VALUE_CONTENTS (inval2),
443 inval2len);
444 }
445 }
446 outval = value_string (ptr, count * inval2len);
447 }
448 else if (TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_BITSTRING
449 || TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_BOOL)
450 {
451 error ("unimplemented support for bitstring/boolean repeats");
452 }
453 else
454 {
455 error ("can't repeat values of that type");
456 }
457 }
458 else if (TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_STRING
459 || TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_CHAR)
460 {
461 /* We have two character strings to concatenate. */
462 if (TYPE_CODE (VALUE_TYPE (inval2)) != TYPE_CODE_STRING
463 && TYPE_CODE (VALUE_TYPE (inval2)) != TYPE_CODE_CHAR)
464 {
465 error ("Strings can only be concatenated with other strings.");
466 }
467 inval1len = TYPE_LENGTH (VALUE_TYPE (inval1));
468 inval2len = TYPE_LENGTH (VALUE_TYPE (inval2));
469 ptr = (char *) alloca (inval1len + inval2len);
470 if (TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_CHAR)
471 {
472 *ptr = (char) unpack_long (VALUE_TYPE (inval1), VALUE_CONTENTS (inval1));
473 }
474 else
475 {
476 memcpy (ptr, VALUE_CONTENTS (inval1), inval1len);
477 }
478 if (TYPE_CODE (VALUE_TYPE (inval2)) == TYPE_CODE_CHAR)
479 {
480 *(ptr + inval1len) =
481 (char) unpack_long (VALUE_TYPE (inval2), VALUE_CONTENTS (inval2));
482 }
483 else
484 {
485 memcpy (ptr + inval1len, VALUE_CONTENTS (inval2), inval2len);
486 }
487 outval = value_string (ptr, inval1len + inval2len);
488 }
489 else if (TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_BITSTRING
490 || TYPE_CODE (VALUE_TYPE (inval1)) == TYPE_CODE_BOOL)
491 {
492 /* We have two bitstrings to concatenate. */
493 if (TYPE_CODE (VALUE_TYPE (inval2)) != TYPE_CODE_BITSTRING
494 && TYPE_CODE (VALUE_TYPE (inval2)) != TYPE_CODE_BOOL)
495 {
496 error ("Bitstrings or booleans can only be concatenated with other bitstrings or booleans.");
497 }
498 error ("unimplemented support for bitstring/boolean concatenation.");
499 }
500 else
501 {
502 /* We don't know how to concatenate these operands. */
503 error ("illegal operands for concatenation.");
504 }
505 return (outval);
506 }
507
508 \f
509 /* Perform a binary operation on two operands which have reasonable
510 representations as integers or floats. This includes booleans,
511 characters, integers, or floats.
512 Does not support addition and subtraction on pointers;
513 use value_add or value_sub if you want to handle those possibilities. */
514
515 value
516 value_binop (arg1, arg2, op)
517 value arg1, arg2;
518 enum exp_opcode op;
519 {
520 register value val;
521
522 COERCE_ENUM (arg1);
523 COERCE_ENUM (arg2);
524
525 if ((TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_FLT
526 &&
527 TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_CHAR
528 &&
529 TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_INT
530 &&
531 TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_BOOL)
532 ||
533 (TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_FLT
534 &&
535 TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_CHAR
536 &&
537 TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_INT
538 &&
539 TYPE_CODE (VALUE_TYPE (arg2)) != TYPE_CODE_BOOL))
540 error ("Argument to arithmetic operation not a number or boolean.");
541
542 if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_FLT
543 ||
544 TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_FLT)
545 {
546 double v1, v2, v;
547 v1 = value_as_double (arg1);
548 v2 = value_as_double (arg2);
549 switch (op)
550 {
551 case BINOP_ADD:
552 v = v1 + v2;
553 break;
554
555 case BINOP_SUB:
556 v = v1 - v2;
557 break;
558
559 case BINOP_MUL:
560 v = v1 * v2;
561 break;
562
563 case BINOP_DIV:
564 v = v1 / v2;
565 break;
566
567 default:
568 error ("Integer-only operation on floating point number.");
569 }
570
571 val = allocate_value (builtin_type_double);
572 SWAP_TARGET_AND_HOST (&v, sizeof (v));
573 *(double *) VALUE_CONTENTS_RAW (val) = v;
574 }
575 else if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_BOOL
576 &&
577 TYPE_CODE (VALUE_TYPE (arg2)) == TYPE_CODE_BOOL)
578 {
579 LONGEST v1, v2, v;
580 v1 = value_as_long (arg1);
581 v2 = value_as_long (arg2);
582
583 switch (op)
584 {
585 case BINOP_BITWISE_AND:
586 v = v1 & v2;
587 break;
588
589 case BINOP_BITWISE_IOR:
590 v = v1 | v2;
591 break;
592
593 case BINOP_BITWISE_XOR:
594 v = v1 ^ v2;
595 break;
596
597 default:
598 error ("Invalid operation on booleans.");
599 }
600
601 /* start-sanitize-chill (FIXME!) */
602 val = allocate_value (builtin_type_chill_bool);
603 /* end-sanitize-chill */
604 SWAP_TARGET_AND_HOST (&v, sizeof (v));
605 *(LONGEST *) VALUE_CONTENTS_RAW (val) = v;
606 }
607 else
608 /* Integral operations here. */
609 /* FIXME: Also mixed integral/booleans, with result an integer. */
610 {
611 /* Should we promote to unsigned longest? */
612 if ((TYPE_UNSIGNED (VALUE_TYPE (arg1))
613 || TYPE_UNSIGNED (VALUE_TYPE (arg2)))
614 && (TYPE_LENGTH (VALUE_TYPE (arg1)) >= sizeof (unsigned LONGEST)
615 || TYPE_LENGTH (VALUE_TYPE (arg1)) >= sizeof (unsigned LONGEST)))
616 {
617 unsigned LONGEST v1, v2, v;
618 v1 = (unsigned LONGEST) value_as_long (arg1);
619 v2 = (unsigned LONGEST) value_as_long (arg2);
620
621 switch (op)
622 {
623 case BINOP_ADD:
624 v = v1 + v2;
625 break;
626
627 case BINOP_SUB:
628 v = v1 - v2;
629 break;
630
631 case BINOP_MUL:
632 v = v1 * v2;
633 break;
634
635 case BINOP_DIV:
636 v = v1 / v2;
637 break;
638
639 case BINOP_REM:
640 v = v1 % v2;
641 break;
642
643 case BINOP_MOD:
644 /* Knuth 1.2.4, integer only. Note that unlike the C '%' op,
645 v1 mod 0 has a defined value, v1. */
646 /* start-sanitize-chill */
647 /* Chill specifies that v2 must be > 0, so check for that. */
648 if (current_language -> la_language == language_chill
649 && value_as_long (arg2) <= 0)
650 {
651 error ("Second operand of MOD must be greater than zero.");
652 }
653 /* end-sanitize-chill */
654 if (v2 == 0)
655 {
656 v = v1;
657 }
658 else
659 {
660 v = v1/v2;
661 /* Note floor(v1/v2) == v1/v2 for unsigned. */
662 v = v1 - (v2 * v);
663 }
664 break;
665
666 case BINOP_LSH:
667 v = v1 << v2;
668 break;
669
670 case BINOP_RSH:
671 v = v1 >> v2;
672 break;
673
674 case BINOP_BITWISE_AND:
675 v = v1 & v2;
676 break;
677
678 case BINOP_BITWISE_IOR:
679 v = v1 | v2;
680 break;
681
682 case BINOP_BITWISE_XOR:
683 v = v1 ^ v2;
684 break;
685
686 case BINOP_LOGICAL_AND:
687 v = v1 && v2;
688 break;
689
690 case BINOP_LOGICAL_OR:
691 v = v1 || v2;
692 break;
693
694 case BINOP_MIN:
695 v = v1 < v2 ? v1 : v2;
696 break;
697
698 case BINOP_MAX:
699 v = v1 > v2 ? v1 : v2;
700 break;
701
702 default:
703 error ("Invalid binary operation on numbers.");
704 }
705
706 val = allocate_value (BUILTIN_TYPE_UNSIGNED_LONGEST);
707 SWAP_TARGET_AND_HOST (&v, sizeof (v));
708 *(unsigned LONGEST *) VALUE_CONTENTS_RAW (val) = v;
709 }
710 else
711 {
712 LONGEST v1, v2, v;
713 v1 = value_as_long (arg1);
714 v2 = value_as_long (arg2);
715
716 switch (op)
717 {
718 case BINOP_ADD:
719 v = v1 + v2;
720 break;
721
722 case BINOP_SUB:
723 v = v1 - v2;
724 break;
725
726 case BINOP_MUL:
727 v = v1 * v2;
728 break;
729
730 case BINOP_DIV:
731 v = v1 / v2;
732 break;
733
734 case BINOP_REM:
735 v = v1 % v2;
736 break;
737
738 case BINOP_MOD:
739 /* Knuth 1.2.4, integer only. Note that unlike the C '%' op,
740 X mod 0 has a defined value, X. */
741 /* start-sanitize-chill */
742 /* Chill specifies that v2 must be > 0, so check for that. */
743 if (current_language -> la_language == language_chill
744 && v2 <= 0)
745 {
746 error ("Second operand of MOD must be greater than zero.");
747 }
748 /* end-sanitize-chill */
749 if (v2 == 0)
750 {
751 v = v1;
752 }
753 else
754 {
755 v = v1/v2;
756 /* Compute floor. */
757 if (TRUNCATION_TOWARDS_ZERO && (v < 0) && ((v1 % v2) != 0))
758 {
759 v--;
760 }
761 v = v1 - (v2 * v);
762 }
763 break;
764
765 case BINOP_LSH:
766 v = v1 << v2;
767 break;
768
769 case BINOP_RSH:
770 v = v1 >> v2;
771 break;
772
773 case BINOP_BITWISE_AND:
774 v = v1 & v2;
775 break;
776
777 case BINOP_BITWISE_IOR:
778 v = v1 | v2;
779 break;
780
781 case BINOP_BITWISE_XOR:
782 v = v1 ^ v2;
783 break;
784
785 case BINOP_LOGICAL_AND:
786 v = v1 && v2;
787 break;
788
789 case BINOP_LOGICAL_OR:
790 v = v1 || v2;
791 break;
792
793 case BINOP_MIN:
794 v = v1 < v2 ? v1 : v2;
795 break;
796
797 case BINOP_MAX:
798 v = v1 > v2 ? v1 : v2;
799 break;
800
801 default:
802 error ("Invalid binary operation on numbers.");
803 }
804
805 val = allocate_value (BUILTIN_TYPE_LONGEST);
806 SWAP_TARGET_AND_HOST (&v, sizeof (v));
807 *(LONGEST *) VALUE_CONTENTS_RAW (val) = v;
808 }
809 }
810
811 return val;
812 }
813 \f
814 /* Simulate the C operator ! -- return 1 if ARG1 contains zero. */
815
816 int
817 value_logical_not (arg1)
818 value arg1;
819 {
820 register int len;
821 register char *p;
822
823 COERCE_ARRAY (arg1);
824
825 if (TYPE_CODE (VALUE_TYPE (arg1)) == TYPE_CODE_FLT)
826 return 0 == value_as_double (arg1);
827
828 len = TYPE_LENGTH (VALUE_TYPE (arg1));
829 p = VALUE_CONTENTS (arg1);
830
831 while (--len >= 0)
832 {
833 if (*p++)
834 break;
835 }
836
837 return len < 0;
838 }
839
840 /* Simulate the C operator == by returning a 1
841 iff ARG1 and ARG2 have equal contents. */
842
843 int
844 value_equal (arg1, arg2)
845 register value arg1, arg2;
846
847 {
848 register int len;
849 register char *p1, *p2;
850 enum type_code code1;
851 enum type_code code2;
852
853 COERCE_ARRAY (arg1);
854 COERCE_ARRAY (arg2);
855
856 code1 = TYPE_CODE (VALUE_TYPE (arg1));
857 code2 = TYPE_CODE (VALUE_TYPE (arg2));
858
859 if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
860 return value_as_long (arg1) == value_as_long (arg2);
861 else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
862 && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
863 return value_as_double (arg1) == value_as_double (arg2);
864
865 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
866 is bigger. */
867 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
868 return value_as_pointer (arg1) == (CORE_ADDR) value_as_long (arg2);
869 else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
870 return (CORE_ADDR) value_as_long (arg1) == value_as_pointer (arg2);
871
872 else if (code1 == code2
873 && ((len = TYPE_LENGTH (VALUE_TYPE (arg1)))
874 == TYPE_LENGTH (VALUE_TYPE (arg2))))
875 {
876 p1 = VALUE_CONTENTS (arg1);
877 p2 = VALUE_CONTENTS (arg2);
878 while (--len >= 0)
879 {
880 if (*p1++ != *p2++)
881 break;
882 }
883 return len < 0;
884 }
885 else
886 {
887 error ("Invalid type combination in equality test.");
888 return 0; /* For lint -- never reached */
889 }
890 }
891
892 /* Simulate the C operator < by returning 1
893 iff ARG1's contents are less than ARG2's. */
894
895 int
896 value_less (arg1, arg2)
897 register value arg1, arg2;
898 {
899 register enum type_code code1;
900 register enum type_code code2;
901
902 COERCE_ARRAY (arg1);
903 COERCE_ARRAY (arg2);
904
905 code1 = TYPE_CODE (VALUE_TYPE (arg1));
906 code2 = TYPE_CODE (VALUE_TYPE (arg2));
907
908 if (code1 == TYPE_CODE_INT && code2 == TYPE_CODE_INT)
909 {
910 if (TYPE_UNSIGNED (VALUE_TYPE (arg1))
911 || TYPE_UNSIGNED (VALUE_TYPE (arg2)))
912 return ((unsigned LONGEST) value_as_long (arg1)
913 < (unsigned LONGEST) value_as_long (arg2));
914 else
915 return value_as_long (arg1) < value_as_long (arg2);
916 }
917 else if ((code1 == TYPE_CODE_FLT || code1 == TYPE_CODE_INT)
918 && (code2 == TYPE_CODE_FLT || code2 == TYPE_CODE_INT))
919 return value_as_double (arg1) < value_as_double (arg2);
920 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_PTR)
921 return value_as_pointer (arg1) < value_as_pointer (arg2);
922
923 /* FIXME: Need to promote to either CORE_ADDR or LONGEST, whichever
924 is bigger. */
925 else if (code1 == TYPE_CODE_PTR && code2 == TYPE_CODE_INT)
926 return value_as_pointer (arg1) < (CORE_ADDR) value_as_long (arg2);
927 else if (code2 == TYPE_CODE_PTR && code1 == TYPE_CODE_INT)
928 return (CORE_ADDR) value_as_long (arg1) < value_as_pointer (arg2);
929
930 else
931 {
932 error ("Invalid type combination in ordering comparison.");
933 return 0;
934 }
935 }
936 \f
937 /* The unary operators - and ~. Both free the argument ARG1. */
938
939 value
940 value_neg (arg1)
941 register value arg1;
942 {
943 register struct type *type;
944
945 COERCE_ENUM (arg1);
946
947 type = VALUE_TYPE (arg1);
948
949 if (TYPE_CODE (type) == TYPE_CODE_FLT)
950 return value_from_double (type, - value_as_double (arg1));
951 else if (TYPE_CODE (type) == TYPE_CODE_INT)
952 return value_from_longest (type, - value_as_long (arg1));
953 else {
954 error ("Argument to negate operation not a number.");
955 return 0; /* For lint -- never reached */
956 }
957 }
958
959 value
960 value_complement (arg1)
961 register value arg1;
962 {
963 COERCE_ENUM (arg1);
964
965 if (TYPE_CODE (VALUE_TYPE (arg1)) != TYPE_CODE_INT)
966 error ("Argument to complement operation not an integer.");
967
968 return value_from_longest (VALUE_TYPE (arg1), ~ value_as_long (arg1));
969 }
970 \f
This page took 0.049039 seconds and 4 git commands to generate.