Subversion Repositories tendra.SVN

Rev

Rev 2 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 2 Rev 7
Line -... Line 1...
-
 
1
/*
-
 
2
 * Copyright (c) 2002-2005 The TenDRA Project <http://www.tendra.org/>.
-
 
3
 * All rights reserved.
-
 
4
 *
-
 
5
 * Redistribution and use in source and binary forms, with or without
-
 
6
 * modification, are permitted provided that the following conditions are met:
-
 
7
 *
-
 
8
 * 1. Redistributions of source code must retain the above copyright notice,
-
 
9
 *    this list of conditions and the following disclaimer.
-
 
10
 * 2. Redistributions in binary form must reproduce the above copyright notice,
-
 
11
 *    this list of conditions and the following disclaimer in the documentation
-
 
12
 *    and/or other materials provided with the distribution.
-
 
13
 * 3. Neither the name of The TenDRA Project nor the names of its contributors
-
 
14
 *    may be used to endorse or promote products derived from this software
-
 
15
 *    without specific, prior written permission.
-
 
16
 *
-
 
17
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS
-
 
18
 * IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
-
 
19
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-
 
20
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
-
 
21
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-
 
22
 * EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-
 
23
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
-
 
24
 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-
 
25
 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
-
 
26
 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
-
 
27
 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
 
28
 *
-
 
29
 * $Id$
-
 
30
 */
1
/*
31
/*
2
    		 Crown Copyright (c) 1997
32
    		 Crown Copyright (c) 1997
3
    
33
 
4
    This TenDRA(r) Computer Program is subject to Copyright
34
    This TenDRA(r) Computer Program is subject to Copyright
5
    owned by the United Kingdom Secretary of State for Defence
35
    owned by the United Kingdom Secretary of State for Defence
6
    acting through the Defence Evaluation and Research Agency
36
    acting through the Defence Evaluation and Research Agency
7
    (DERA).  It is made available to Recipients with a
37
    (DERA).  It is made available to Recipients with a
8
    royalty-free licence for its use, reproduction, transfer
38
    royalty-free licence for its use, reproduction, transfer
9
    to other parties and amendment for any purpose not excluding
39
    to other parties and amendment for any purpose not excluding
10
    product development provided that any such use et cetera
40
    product development provided that any such use et cetera
11
    shall be deemed to be acceptance of the following conditions:-
41
    shall be deemed to be acceptance of the following conditions:-
12
    
42
 
13
        (1) Its Recipients shall ensure that this Notice is
43
        (1) Its Recipients shall ensure that this Notice is
14
        reproduced upon any copies or amended versions of it;
44
        reproduced upon any copies or amended versions of it;
15
    
45
 
16
        (2) Any amended version of it shall be clearly marked to
46
        (2) Any amended version of it shall be clearly marked to
17
        show both the nature of and the organisation responsible
47
        show both the nature of and the organisation responsible
18
        for the relevant amendment or amendments;
48
        for the relevant amendment or amendments;
19
    
49
 
20
        (3) Its onward transfer from a recipient to another
50
        (3) Its onward transfer from a recipient to another
21
        party shall be deemed to be that party's acceptance of
51
        party shall be deemed to be that party's acceptance of
22
        these conditions;
52
        these conditions;
23
    
53
 
24
        (4) DERA gives no warranty or assurance as to its
54
        (4) DERA gives no warranty or assurance as to its
25
        quality or suitability for any purpose and DERA accepts
55
        quality or suitability for any purpose and DERA accepts
26
        no liability whatsoever in relation to any use to which
56
        no liability whatsoever in relation to any use to which
27
        it may be put.
57
        it may be put.
28
*/
58
*/
29
 
59
 
30
 
60
 
31
/* 	$Id: coder.c,v 1.2 1998/02/04 10:43:30 release Exp $	 */
61
/* 	$Id$	 */
32
 
62
 
33
#ifndef lint
63
#ifndef lint
34
static char vcid[] = "$Id: coder.c,v 1.2 1998/02/04 10:43:30 release Exp $";
64
static char vcid[] = "$Id$";
35
#endif /* lint */
65
#endif /* lint */
36
/*
66
/*
37
$Log: coder.c,v $
67
$Log: coder.c,v $
38
 * Revision 1.2  1998/02/04  10:43:30  release
68
 * Revision 1.2  1998/02/04  10:43:30  release
39
 * Changes during testing.
69
 * Changes during testing.
Line 53... Line 83...
53
 * Revision 1.43  1996/03/15  10:29:39  john
83
 * Revision 1.43  1996/03/15  10:29:39  john
54
 * Fix to char & short ops
84
 * Fix to char & short ops
55
 *
85
 *
56
 * Revision 1.42  1996/02/29  17:35:49  john
86
 * Revision 1.42  1996/02/29  17:35:49  john
57
 * Fix to remainder op
87
 * Fix to remainder op
58
 *
88
 *
59
 * Revision 1.41  1996/02/19  09:25:05  john
89
 * Revision 1.41  1996/02/19  09:25:05  john
60
 * change to register
90
 * change to register
61
 *
91
 *
62
 * Revision 1.40  1996/02/15  09:49:16  john
92
 * Revision 1.40  1996/02/15  09:49:16  john
63
 * Some changes to general proc handling
93
 * Some changes to general proc handling
Line 83... Line 113...
83
 * Revision 1.33  1995/10/27  12:07:40  john
113
 * Revision 1.33  1995/10/27  12:07:40  john
84
 * Fix to same_callees
114
 * Fix to same_callees
85
 *
115
 *
86
 * Revision 1.32  1995/10/24  09:27:53  john
116
 * Revision 1.32  1995/10/24  09:27:53  john
87
 * Fixes to large numbers
117
 * Fixes to large numbers
88
 *
118
 *
89
 * Revision 1.31  1995/10/19  16:36:13  john
119
 * Revision 1.31  1995/10/19  16:36:13  john
90
 * Fix to error treatments
120
 * Fix to error treatments
91
 *
121
 *
92
 * Revision 1.30  1995/10/18  09:28:40  john
122
 * Revision 1.30  1995/10/18  09:28:40  john
93
 * Fix to round_tag
123
 * Fix to round_tag
Line 113... Line 143...
113
 * Revision 1.23  1995/09/07  12:27:46  john
143
 * Revision 1.23  1995/09/07  12:27:46  john
114
 * Changes to general procs
144
 * Changes to general procs
115
 *
145
 *
116
 * Revision 1.22  1995/09/04  16:13:00  john
146
 * Revision 1.22  1995/09/04  16:13:00  john
117
 * Fix to general procs
147
 * Fix to general procs
118
 *
148
 *
119
 * Revision 1.21  1995/09/01  09:08:56  john
149
 * Revision 1.21  1995/09/01  09:08:56  john
120
 * Fix to mult_tag
150
 * Fix to mult_tag
121
 *
151
 *
122
 * Revision 1.20  1995/08/31  15:41:46  john
152
 * Revision 1.20  1995/08/31  15:41:46  john
123
 * Added fmax_tag & fixed some limits bugs
153
 * Added fmax_tag & fixed some limits bugs
Line 143... Line 173...
143
 * Revision 1.13  1995/07/27  09:24:39  john
173
 * Revision 1.13  1995/07/27  09:24:39  john
144
 * Changed general procs, repositioned $fp
174
 * Changed general procs, repositioned $fp
145
 *
175
 *
146
 * Revision 1.12  1995/07/04  09:07:43  john
176
 * Revision 1.12  1995/07/04  09:07:43  john
147
 * Fixed tail call
177
 * Fixed tail call
148
 *
178
 *
149
 * Revision 1.11  1995/06/30  07:58:34  john
179
 * Revision 1.11  1995/06/30  07:58:34  john
150
 * Fixed bug in tail_call, callee parameters were being passed the wrong
180
 * Fixed bug in tail_call, callee parameters were being passed the wrong
151
 * way round.
181
 * way round.
152
 *
182
 *
153
 * Revision 1.10  1995/06/28  10:19:37  john
183
 * Revision 1.10  1995/06/28  10:19:37  john
154
 * Fix to shr_tag
184
 * Fix to shr_tag
155
 *
185
 *
156
 * Revision 1.9  1995/06/21  14:24:51  john
186
 * Revision 1.9  1995/06/21  14:24:51  john
157
 * Reformatting
187
 * Reformatting
158
 *
188
 *
159
 * Revision 1.8  1995/06/15  09:43:44  john
189
 * Revision 1.8  1995/06/15  09:43:44  john
160
 * Added code for stack error handling
190
 * Added code for stack error handling
161
 *
191
 *
162
 * Revision 1.7  1995/06/15  08:34:41  john
192
 * Revision 1.7  1995/06/15  08:34:41  john
163
 * Some reformatting and additions for new error treatment
193
 * Some reformatting and additions for new error treatment
164
 *
194
 *
165
 * Revision 1.6  1995/05/25  15:33:02  john
195
 * Revision 1.6  1995/05/25  15:33:02  john
166
 * Cosmetic changes
196
 * Cosmetic changes
167
 *
197
 *
168
 * Revision 1.5  1995/05/23  10:53:53  john
198
 * Revision 1.5  1995/05/23  10:53:53  john
169
 * Reformatting + additions for spec 3.1
199
 * Reformatting + additions for spec 3.1
170
 *
200
 *
171
 * Revision 1.4  1995/04/10  14:14:50  john
201
 * Revision 1.4  1995/04/10  14:14:50  john
172
 * Added new division code.  Not fully tested in this version
202
 * Added new division code.  Not fully tested in this version
Line 187... Line 217...
187
 * Removed bitfield operations, fixed local_free_tag and changed
217
 * Removed bitfield operations, fixed local_free_tag and changed
188
 * chvar_tag
218
 * chvar_tag
189
 *
219
 *
190
 * Revision 1.49  1995/03/09  14:08:55  john
220
 * Revision 1.49  1995/03/09  14:08:55  john
191
 * Introduced code to use the scheduler, and fixed a bug in test_tag
221
 * Introduced code to use the scheduler, and fixed a bug in test_tag
192
 *
222
 *
193
 * Revision 1.48  1995/02/09  17:17:29  john
223
 * Revision 1.48  1995/02/09  17:17:29  john
194
 * Fix to rep_tag and local_free_tag
224
 * Fix to rep_tag and local_free_tag
195
 *
225
 *
196
 * Revision 1.47  1995/02/06  16:45:11  john
226
 * Revision 1.47  1995/02/06  16:45:11  john
197
 * Fix to case_tag
227
 * Fix to case_tag
198
 *
228
 *
199
 * Revision 1.46  1995/01/26  13:30:54  john
229
 * Revision 1.46  1995/01/26  13:30:54  john
200
 * Modified error jump handling, and did some reformating
230
 * Modified error jump handling, and did some reformating
201
 *
231
 *
202
 * Revision 1.45  1995/01/23  09:18:45  john
232
 * Revision 1.45  1995/01/23  09:18:45  john
203
 * First attempt at implementing error jumps
233
 * First attempt at implementing error jumps
204
 *
234
 *
205
 * Revision 1.44  1995/01/18  11:49:03  john
235
 * Revision 1.44  1995/01/18  11:49:03  john
206
 * Fixed errors in abslike_tag and case_tag, and added overflow check to
236
 * Fixed errors in abslike_tag and case_tag, and added overflow check to
207
 * div_tag
237
 * div_tag
208
 *
238
 *
209
 * Revision 1.43  1995/01/17  10:30:44  john
239
 * Revision 1.43  1995/01/17  10:30:44  john
Line 212... Line 242...
212
 * Revision 1.42  1995/01/10  09:42:23  john
242
 * Revision 1.42  1995/01/10  09:42:23  john
213
 * Minor reformating and removal of dead code.
243
 * Minor reformating and removal of dead code.
214
 *
244
 *
215
*/
245
*/
216
 
246
 
217
/* 
247
/*
218
   coder.c
248
   coder.c
219
   This is the principal code producing module
249
   This is the principal code producing module
220
*/
250
*/
221
#include "config.h"
251
#include "config.h"
222
#include "coder.h"
252
#include "coder.h"
Line 311... Line 341...
311
/*
341
/*
312
outofline *odd_bits;
342
outofline *odd_bits;
313
int doing_odd_bits;
343
int doing_odd_bits;
314
*/
344
*/
315
/* put register number 'Reg' back into the current space. */
345
/* put register number 'Reg' back into the current space. */
316
#define replace_reg(Reg,Space) ((Space) & ~(1<<(Reg)))
346
#define replace_reg(Reg,Space)((Space) & ~(1<< (Reg)))
317
 
347
 
318
#define fix_parameter_size(X,Y) if(Y==32){\
348
#define fix_parameter_size(X,Y) if (Y==32) {\
319
operate_fmt_immediate(i_addl,X,0,X);\
349
operate_fmt_immediate(i_addl,X,0,X);\
320
}
350
}
321
 
351
 
322
#define error_treatment_is_trap(e) ((errhandle(e)&3)==3)
352
#define error_treatment_is_trap(e)((errhandle(e) &3) ==3)
323
 
353
 
324
/*
354
/*
325
  Return TRUE if the floating point number is zero and FALSE
355
  Return TRUE if the floating point number is zero and FALSE
326
  otherwise.
356
  otherwise.
327
*/
357
*/
328
static bool is_fzero
358
static bool is_fzero
329
    PROTO_N ( ( fnum ) )
-
 
330
    PROTO_T ( flt fnum )
359
(flt fnum)
331
{
360
{
332
  int i;
361
  int i;
333
  for(i=0;(i<MANT_SIZE) && (fnum.mant[i]==0);++i);
362
  for (i=0;(i<MANT_SIZE) && (fnum.mant[i] ==0);++i);
334
  return (i==MANT_SIZE);
363
  return(i==MANT_SIZE);
335
}
364
}
336
 
365
 
337
 
366
 
338
 
367
 
339
/*
368
/*
340
  Functions to handle the 'trap' exception handling mechanism
369
  Functions to handle the 'trap' exception handling mechanism
341
*/
370
*/
342
static int trap_label
371
static int trap_label
343
    PROTO_N ( ( e ) )
-
 
344
    PROTO_T ( exp e )
372
(exp e)
345
{
373
{
346
  if (error_treatment_is_trap(e)){
374
  if (error_treatment_is_trap(e)) {
347
    if (aritherr_lab == 0) aritherr_lab = new_label();
375
    if (aritherr_lab == 0)aritherr_lab = new_label();
348
    return aritherr_lab;
376
    return aritherr_lab;
349
  }
377
  }
350
  else return no(son(pt(e)));
378
  else return no(son(pt(e)));
351
}
379
}
352
 
380
 
353
static void do_exception
381
static void do_exception
354
    PROTO_N ( ( ex ) )
-
 
355
    PROTO_T ( int ex )
382
(int ex)
356
{
383
{
357
  baseoff b;
384
  baseoff b;
358
 
385
 
359
  load_store_immediate(i_ldiq, FIRST_INT_ARG,  ex);
386
  load_store_immediate(i_ldiq, FIRST_INT_ARG,  ex);
360
  setnoat();
387
  setnoat();
Line 369... Line 396...
369
  return;
396
  return;
370
}
397
}
371
 
398
 
372
 
399
 
373
/*
400
/*
374
  check that the floating point register contains a non-negative 
401
  check that the floating point register contains a non-negative
375
  value and,if it does, convert to signed by adding the 
402
  value and,if it does, convert to signed by adding the
376
  appropriate constant.
403
  appropriate constant.
377
*/
404
*/
378
static void fix_unsigned
405
static void fix_unsigned
379
    PROTO_N ( ( fr,sp,name ) )
-
 
380
    PROTO_T ( freg fr X space sp X int name )
406
(freg fr, space sp, int name)
381
{
407
{
382
  space nsp;
408
  space nsp;
383
  int ftmp;
409
  int ftmp;
384
  freg newfr;  
410
  freg newfr;
385
  ans aa;
411
  ans aa;
386
  flpt fltval;
412
  flpt fltval;
387
  exp float_exp;
413
  exp float_exp;
388
  instore isa;
414
  instore isa;
389
  where dest;
415
  where dest;
390
  flt constval;
416
  flt constval;
391
  nsp = guardfreg(fr.fr,sp);
417
  nsp = guardfreg(fr.fr,sp);
392
  ftmp = getfreg(nsp.flt);
418
  ftmp = getfreg(nsp.flt);
393
  fltval = new_flpt();
419
  fltval = new_flpt();
394
  switch(name){
420
  switch (name) {
395
    case uwordhd:
421
    case uwordhd:
396
    constval = alpha_word_max;
422
    constval = alpha_word_max;
397
    break;
423
    break;
398
    case ulonghd:
424
    case ulonghd:
399
    constval =  alpha_long_max;
425
    constval =  alpha_long_max;
Line 417... Line 443...
417
  dest.ashwhere.ashsize = (fr.type == IEEE_single)?32:64;
443
  dest.ashwhere.ashsize = (fr.type == IEEE_single)?32:64;
418
  dest.ashwhere.ashalign = dest.ashwhere.ashsize;
444
  dest.ashwhere.ashalign = dest.ashwhere.ashsize;
419
  newfr.fr = ftmp;
445
  newfr.fr = ftmp;
420
  newfr.type = fr.type;
446
  newfr.type = fr.type;
421
  setfregalt(dest.answhere,newfr);
447
  setfregalt(dest.answhere,newfr);
422
  (void)move(aa,dest,nsp,0);
448
 (void)move(aa,dest,nsp,0);
423
  float_op((fr.type == IEEE_single)?i_adds:i_addt,fr.fr,ftmp,ftmp);
449
  float_op((fr.type == IEEE_single)?i_adds:i_addt,fr.fr,ftmp,ftmp);
424
  float_op(i_fcmovlt,fr.fr,ftmp,fr.fr);
450
  float_op(i_fcmovlt,fr.fr,ftmp,fr.fr);
425
  comment("END fix_unsigned");
451
  comment("END fix_unsigned");
426
  return;
452
  return;
427
}
453
}
428
 
454
 
429
 
455
 
430
INT64 unsigned_rep
456
INT64 unsigned_rep
431
    PROTO_N ( ( val, dest_shape ) )
-
 
432
    PROTO_T ( INT64 val X shape dest_shape )
457
(INT64 val, shape dest_shape)
433
{
458
{
434
  switch(name (dest_shape)){
459
  switch (name(dest_shape)) {
435
    case ucharhd: return val & 0xff;
460
    case ucharhd: return val & 0xff;
436
    case uwordhd: return val & 0xffff;
461
    case uwordhd: return val & 0xffff;
437
    case ulonghd: return val & 0xffffffff;
462
    case ulonghd: return val & 0xffffffff;
438
    case u64hd: return val;
463
    case u64hd: return val;
439
  }
464
  }
Line 444... Line 469...
444
 
469
 
445
/*
470
/*
446
  Inserts global pointer reference.
471
  Inserts global pointer reference.
447
*/
472
*/
448
static void set_global_pointer
473
static void set_global_pointer
449
    PROTO_Z ()
474
(void)
450
{
475
{
451
  baseoff a;
476
  baseoff a;
452
  a.offset = 0;
477
  a.offset = 0;
453
  a.base = PV;
478
  a.base = PV;
454
  load_store(i_ldgp,GP,a);
479
  load_store(i_ldgp,GP,a);
455
  return;
480
  return;
456
}
481
}
457
 
482
 
458
#if !DO_NEW_DIVISION
483
#if !DO_NEW_DIVISION
459
/*
484
/*
460
  This function produces a code sequence to divide the contents of 
485
  This function produces a code sequence to divide the contents of
461
  register 'src' by constant value 'm' and store the result in
486
  register 'src' by constant value 'm' and store the result in
462
  register 'target'.  The division is performed by calculating 
487
  register 'target'.  The division is performed by calculating
463
  umax64/b and then performing an umulh of this with the source 
488
  umax64/b and then performing an umulh of this with the source
464
  register.
489
  register.
465
*/
490
*/
466
static void divide_by_constant
491
static void divide_by_constant
467
    PROTO_N ( ( src,m,target,sp ) )
-
 
468
    PROTO_T ( int src X INT64 m X int target X space sp )
492
(int src, INT64 m, int target, space sp)
469
{
493
{
470
  space newsp;
494
  space newsp;
471
  int rtmp;
495
  int rtmp;
472
  int ruse;
496
  int ruse;
473
  INT64 divres;
497
  INT64 divres;
Line 487... Line 511...
487
  return;
511
  return;
488
}
512
}
489
#endif
513
#endif
490
 
514
 
491
#if DO_NEW_DIVISION
515
#if DO_NEW_DIVISION
492
 
516
 
493
/* 
517
/*
494
   Output log2(x) rounding up.
518
   Output log2(x) rounding up.
495
*/
519
*/
496
int log2
520
int log2
497
    PROTO_N ( ( val ) )
-
 
498
    PROTO_T ( INT64 val )
521
(INT64 val)
499
{
522
{
500
  int res = 0;
523
  int res = 0;
501
  int absval = abs(val);
524
  int absval = abs(val);
502
  while(!INT64_eq(absval,make_INT64(0,1))){
525
  while (!INT64_eq(absval,make_INT64(0,1))) {
503
    /*while (absval != 1){*/
526
    /*while (absval != 1){*/
504
    while (!INT64_eq(INT64_mod(absval,make_INT64(0,2),1),make_INT64(0,0))){
527
    while (!INT64_eq(INT64_mod(absval,make_INT64(0,2),1),make_INT64(0,0))) {
505
      /*while (absval % 2){*/
528
      /*while (absval % 2){*/
506
      absval = INT64_increment(absval);
529
      absval = INT64_increment(absval);
507
      /*++absval;*/
530
      /*++absval;*/
508
    }
531
    }
509
    while (INT64_eq(INT64_mod(absval,make_INT64(0,2),1),make_INT64(0,0))){
532
    while (INT64_eq(INT64_mod(absval,make_INT64(0,2),1),make_INT64(0,0))) {
510
      /*while (absval % 2 == 0){*/
533
      /*while (absval % 2 == 0){*/
511
      ++res;
534
      ++res;
512
      absval = INT64_divide(absval,make_INT64(0,2),1);
535
      absval = INT64_divide(absval,make_INT64(0,2),1);
513
      /*absval /=2;*/
536
      /*absval /=2;*/
514
    }
537
    }
515
  }
538
  }
516
  return res;
539
  return res;
517
}
540
}
518
 
541
 
519
 
542
 
520
 
543
 
521
 
544
 
522
/*
545
/*
523
  If 1/m can be transformed into the form:
546
  If 1/m can be transformed into the form:
524
 
547
 
525
  1/m = 1/(2^n) * (2^x/b).  Then return the values of n and x
548
  1/m = 1/(2^n) * (2^x/b).  Then return the values of n and x
526
  required.  If successfull, return TRUE, otherwise, return FALSE.
549
  required.  If successfull, return TRUE, otherwise, return FALSE.
527
*/
550
*/
528
bool calculate_shift_for_division
551
bool calculate_shift_for_division
529
    PROTO_N ( ( m,n,x,is_quad ) )
-
 
530
    PROTO_T ( INT64 m X int *n X int *x X bool is_quad )
552
(INT64 m, int *n, int *x, bool is_quad)
531
{
553
{
532
  INT64 val = m;
554
  INT64 val = m;
533
  INT64 r;
555
  INT64 r;
534
  int shift=0;
556
  int shift=0;
535
  int power = 1;
557
  int power = 1;
536
  INT64 max32 = make_INT64(0,0xffffffff);
558
  INT64 max32 = make_INT64(0,0xffffffff);
537
  INT64 max16 = make_INT64(0,0xffff);
559
  INT64 max16 = make_INT64(0,0xffff);
538
  if (is_quad){
560
  if (is_quad) {
539
    /*r = (429496729L%m) * 429496729L;*/
561
    /*r = (429496729L%m) * 429496729L;*/
540
    r = INT64_mult( max32, INT64_mod(max32,m,1),1);
562
    r = INT64_mult(max32, INT64_mod(max32,m,1),1);
541
  }
563
  }
542
  else{
564
  else{
543
    /*r = (65536%m) *65536;*/
565
    /*r = (65536%m) *65536;*/
544
    r = INT64_mult( max16, INT64_mod(max16,m,1),1);
566
    r = INT64_mult(max16, INT64_mod(max16,m,1),1);
545
  }
567
  }
546
  r = INT64_mod(r,val,1);
568
  r = INT64_mod(r,val,1);
547
  /*r = r % val; */
569
  /*r = r % val; */
548
  while(INT64_eq(INT64_mod(val,make_INT64(0,2),1),make_INT64(0,0))){
570
  while (INT64_eq(INT64_mod(val,make_INT64(0,2),1),make_INT64(0,0))) {
549
    /*  while(val%2 == 0){*/
571
    /*  while(val%2 == 0){*/
550
    val = INT64_shift_right(val,1,1);
572
    val = INT64_shift_right(val,1,1);
551
    /*val/=2;*/
573
    /*val/=2;*/
552
    shift++;
574
    shift++;
553
  }
575
  }
554
  if (INT64_eq(val,make_INT64(0,1))){
576
  if (INT64_eq(val,make_INT64(0,1))) {
555
    failer("Unexpected power of 2 in shift calculation");
577
    failer("Unexpected power of 2 in shift calculation");
556
    exit(EXIT_FAILURE);
578
    exit(EXIT_FAILURE);
557
  }
579
  }
558
  while ((INT64_lt(make_INT64(0,power),val) && 
580
  while ((INT64_lt(make_INT64(0,power),val) &&
559
	  INT64_lt(make_INT64(0,power), INT64_subtract(val,r,1)))){
581
	  INT64_lt(make_INT64(0,power), INT64_subtract(val,r,1)))) {
560
    /*while ((power<val) && (val-r > power)){*/
582
    /*while ((power<val) && (val-r > power)){*/
561
    r = INT64_mult(r,make_INT64(0,2),1);
583
    r = INT64_mult(r,make_INT64(0,2),1);
562
    /*r *= 2;*/
584
    /*r *= 2;*/
563
    /*r = r % val;*/
585
    /*r = r % val;*/
564
    r = INT64_mod(r,val,1);
586
    r = INT64_mod(r,val,1);
Line 571... Line 593...
571
  /*return (power<val)?TRUE:FALSE;*/
593
  /*return (power<val)?TRUE:FALSE;*/
572
}
594
}
573
 
595
 
574
 
596
 
575
/*
597
/*
576
  This function produces a code sequence to divide the contents of 
598
  This function produces a code sequence to divide the contents of
577
  register 'src' by constant value 'm' and store the result in
599
  register 'src' by constant value 'm' and store the result in
578
  register 'target'.  The division is performed by calculating 
600
  register 'target'.  The division is performed by calculating
579
  umax64/b and then performing an umulh of this with the source 
601
  umax64/b and then performing an umulh of this with the source
580
  register.  The code produced makes use of the AT register.
602
  register.  The code produced makes use of the AT register.
581
*/
603
*/
582
static void divide_by_constant
604
static void divide_by_constant
583
    PROTO_N ( ( div,lhs,valexp,r_dest,nsp ) )
-
 
584
    PROTO_T ( exp div X exp lhs X exp valexp X int r_dest X space nsp )
605
(exp div, exp lhs, exp valexp, int r_dest, space nsp)
585
{
606
{
586
  INT64 m = zero_int64;	
607
  INT64 m = zero_int64;
587
  INT64 divres;
608
  INT64 divres;
588
  bool simple_div;
609
  bool simple_div;
589
  INT64 max_val;
610
  INT64 max_val;
590
  INT64 factor;
611
  INT64 factor;
591
  int shift,power /*,factor*/;
612
  int shift,power /*,factor*/;
592
  int src = reg_operand(lhs,nsp);
613
  int src = reg_operand(lhs,nsp);
593
  int ruse,rdest,r_frac_value;
614
  int ruse,rdest,r_frac_value;
594
  space newsp = guardreg(src,nsp);
615
  space newsp = guardreg(src,nsp);
595
  int is_quad = !is32(sh(lhs));
616
  int is_quad = !is32(sh(lhs));
596
  newsp = guardreg(r_dest,newsp);
617
  newsp = guardreg(r_dest,newsp);
597
  if(!is_quad){
618
  if (!is_quad) {
598
    m = make_INT64(0,no(valexp));
619
    m = make_INT64(0,no(valexp));
599
  }
620
  }
600
  else{
621
  else{
601
    m = flt64_to_INT64(exp_to_f64(valexp));
622
    m = flt64_to_INT64(exp_to_f64(valexp));
602
  }	
623
  }
603
  if(!is_signed(sh(lhs)) && INT64_lt(m,make_INT64(0,0))){
624
  if (!is_signed(sh(lhs)) && INT64_lt(m,make_INT64(0,0))) {
604
    setnoat();
625
    setnoat();
605
    load_store_immediate(i_ldiq,AT,m);
626
    load_store_immediate(i_ldiq,AT,m);
606
    operate_fmt(i_cmpule,AT,src,rdest);
627
    operate_fmt(i_cmpule,AT,src,rdest);
607
    setat();
628
    setat();
608
    return;
629
    return;
609
  }	
630
  }
610
  /*max_val = is_quad?0xffffffffffffffffL:0xffffffffL;*/
631
  /*max_val = is_quad?0xffffffffffffffffL:0xffffffffL;*/
611
  max_val = is_quad?make_INT64(0xffffffff,0xffffffff):make_INT64(0,0xffffffff);
632
  max_val = is_quad?make_INT64(0xffffffff,0xffffffff):make_INT64(0,0xffffffff);
612
  
633
 
613
  simple_div = calculate_shift_for_division(m,&shift,&power,is_quad);
634
  simple_div = calculate_shift_for_division(m,&shift,&power,is_quad);
614
  r_frac_value = r_dest;	/* alias, saves registers */
635
  r_frac_value = r_dest;	/* alias, saves registers */
615
  if(simple_div){
636
  if (simple_div) {
616
    factor = m/*2<<power*/;
637
    factor = m/*2<<power*/;
617
    factor = INT64_shift_left(make_INT64(0,2),log2(m)-1,1);
638
    factor = INT64_shift_left(make_INT64(0,2),log2(m) -1,1);
618
    /*factor = 2<<(log2(m)-1);*/
639
    /*factor = 2<<(log2(m)-1);*/
619
  }
640
  }
620
  else if(is_signed(sh(lhs))){
641
  else if (is_signed(sh(lhs))) {
621
    factor = (m);
642
    factor = (m);
622
    factor = INT64_shift_left(make_INT64(0,2),log2(m)-1,1);
643
    factor = INT64_shift_left(make_INT64(0,2),log2(m) -1,1);
623
    /*factor = 2<<(log2(m)-1);*/
644
    /*factor = 2<<(log2(m)-1);*/
624
    shift = 0 /*factor*/;
645
    shift = 0 /*factor*/;
625
  }
646
  }
626
  else{
647
  else{
627
    factor = INT64_subtract(
648
    factor = INT64_subtract(
628
			    INT64_shift_left(make_INT64(0,2),log2(m)-1,1),
649
			    INT64_shift_left(make_INT64(0,2),log2(m) -1,1),
629
			    m,1);
650
			    m,1);
630
    /*factor = (2<<(log2(m)-1))-m;*/
651
    /*factor = (2<<(log2(m)-1))-m;*/
631
    /*    factor = power-m;*/
652
    /*    factor = power-m;*/
632
  }
653
  }
633
  divres = INT64_add(INT64_divide(factor,m,1),
654
  divres = INT64_add(INT64_divide(factor,m,1),
634
		     INT64_mult(
655
		     INT64_mult(
635
				INT64_divide(max_val,m,1),
656
				INT64_divide(max_val,m,1),
636
				factor,
657
				factor,
637
				1
658
				1
638
				),	
659
				),
639
		     1
660
		     1
640
		     );
661
		    );
641
  /*  divres = factor/m + (max_val/m)*factor;*/
662
  /*  divres = factor/m + (max_val/m)*factor;*/
642
  if(!is_quad) divres = 
663
  if (!is_quad)divres =
643
    INT64_add(
664
    INT64_add(
644
	      INT64_divide(
665
	      INT64_divide(
645
			   INT64_shift_left(
666
			   INT64_shift_left(
646
					    make_INT64(0,1),
667
					    make_INT64(0,1),
647
					    32+log2(m)-1,
668
					    32+log2(m) -1,
648
					    1
669
					    1
649
					    ),
670
					   ),
650
			   m,
671
			   m,
651
			   1
672
			   1
652
			   ),
673
			  ),
653
	      INT64_divide(
674
	      INT64_divide(
654
			   INT64_shift_left(
675
			   INT64_shift_left(
655
					    make_INT64(0,1),
676
					    make_INT64(0,1),
656
					    log2(m)-1,
677
					    log2(m) -1,
657
					    1
678
					    1
658
					    ),
679
					   ),
659
			   m,
680
			   m,
660
			   1
681
			   1
661
			   ),
682
			  ),
662
	      1
683
	      1
663
	      );
684
	     );
664
#if 0				        
685
#if 0
665
  if (!is_quad) divres = (((long)0x1<<(32+log2(m)))/m) + (1<<log2(m))/m;
686
  if (!is_quad)divres = (((long)0x1<< (32+log2(m))) /m) + (1<<log2(m)) /m;
666
#endif
687
#endif
667
  if(is_signed(sh(lhs))){
688
  if (is_signed(sh(lhs))) {
668
    /*ruse = getreg(newsp.fixed);*/
689
    /*ruse = getreg(newsp.fixed);*/
669
    ruse = AT;
690
    ruse = AT;
670
    setnoat();
691
    setnoat();
671
    operate_fmt(i_subq,31,src,ruse);
692
    operate_fmt(i_subq,31,src,ruse);
672
    operate_fmt(i_cmovgt,src,src,ruse);
693
    operate_fmt(i_cmovgt,src,src,ruse);
673
  }	
694
  }
674
  else{
695
  else{
675
    if(!is_quad){
696
    if (!is_quad) {
676
      /*ruse = getreg(newsp.fixed);*/
697
      /*ruse = getreg(newsp.fixed);*/
677
      ruse = AT;
698
      ruse = AT;
678
      setnoat();
699
      setnoat();
679
      operate_fmt_immediate(i_zap,src,240,ruse);
700
      operate_fmt_immediate(i_zap,src,240,ruse);
680
    }
701
    }
681
    else {
702
    else {
682
      ruse = src;
703
      ruse = src;
683
    }	
704
    }
684
  }
705
  }
685
  if(is_quad){
706
  if (is_quad) {
686
    operate_fmt_big_immediate(i_umulh,ruse,divres,r_dest);
707
    operate_fmt_big_immediate(i_umulh,ruse,divres,r_dest);
687
  }
708
  }
688
  else{
709
  else{
689
    load_store_immediate(i_ldiq,r_frac_value,divres);
710
    load_store_immediate(i_ldiq,r_frac_value,divres);
690
    operate_fmt(i_mulq,ruse,r_frac_value,r_dest);
711
    operate_fmt(i_mulq,ruse,r_frac_value,r_dest);
691
  }	
712
  }
692
  if(is_signed(sh(lhs))){
713
  if (is_signed(sh(lhs))) {
693
    operate_fmt_immediate(i_sra,r_dest,(is_quad?0:32)+log2(m)-1,r_dest);
714
    operate_fmt_immediate(i_sra,r_dest,(is_quad?0:32) +log2(m) -1,r_dest);
694
  }
715
  }
695
  else{
716
  else{
696
    operate_fmt_immediate(i_srl,r_dest,(is_quad?0:32)+((!simple_div)?0:
717
    operate_fmt_immediate(i_srl,r_dest,(is_quad?0:32) + ((!simple_div)?0:
697
						       (log2(m)-1)),r_dest);
718
						      (log2(m) -1)),r_dest);
698
  }
719
  }
699
  if(is_signed(sh(lhs))){
720
  if (is_signed(sh(lhs))) {
700
    operate_fmt(i_subq,31,r_dest,ruse);
721
    operate_fmt(i_subq,31,r_dest,ruse);
701
    operate_fmt(INT64_lt(make_INT64(0,0),m)?i_cmovlt:i_cmovgt,src,ruse,r_dest);
722
    operate_fmt(INT64_lt(make_INT64(0,0),m)?i_cmovlt:i_cmovgt,src,ruse,r_dest);
702
    /*operate_fmt((m>0)?i_cmovlt:i_cmovgt,src,ruse,r_dest);*/
723
    /*operate_fmt((m>0)?i_cmovlt:i_cmovgt,src,ruse,r_dest);*/
703
  }
724
  }
704
  else if(!simple_div && !is_signed(sh(lhs))){
725
  else if (!simple_div && !is_signed(sh(lhs))) {
705
    operate_fmt(i_addq,r_dest,ruse,r_dest);
726
    operate_fmt(i_addq,r_dest,ruse,r_dest);
706
    operate_fmt_immediate(i_srl,r_dest,log2(m),r_dest);
727
    operate_fmt_immediate(i_srl,r_dest,log2(m),r_dest);
707
  }
728
  }
708
  if (ruse == AT) setat();
729
  if (ruse == AT)setat();
709
  return;
730
  return;
710
}
731
}
711
 
732
 
712
#endif
733
#endif
713
 
734
 
714
 
735
 
715
 
736
 
716
/*
737
/*
717
  This function produces a code sequence to convert the value in 
738
  This function produces a code sequence to convert the value in
718
  register reg from shape src_shape to shape dest_shape. 
739
  register reg from shape src_shape to shape dest_shape.
719
  Returns TRUE if any code is produced and FALSE otherwise.
740
  Returns TRUE if any code is produced and FALSE otherwise.
720
*/
741
*/
721
static bool convert_shapes
742
static bool convert_shapes
722
    PROTO_N ( ( dest_shape,src_shape,reg,dreg ) )
-
 
723
    PROTO_T ( int dest_shape X int src_shape X int reg X int dreg )
743
(int dest_shape, int src_shape, int reg, int dreg)
724
{
744
{
725
  if(reg<32 && dreg<32){
745
  if (reg<32 && dreg<32) {
726
    switch(dest_shape){
746
    switch (dest_shape) {
727
      case s64hd:
747
      case s64hd:
728
      case u64hd:
748
      case u64hd:
729
      switch(src_shape){
749
      switch (src_shape) {
730
	case ucharhd:
750
	case ucharhd:
731
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
751
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
732
	/* clear all but the bottom byte */
752
	/* clear all but the bottom byte */
733
	return TRUE;
753
	return TRUE;
734
	case uwordhd:
754
	case uwordhd:
735
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
755
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
736
	return TRUE;
756
	return TRUE;
737
	case ulonghd:
757
	case ulonghd:
738
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
758
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
739
	return TRUE;
759
	return TRUE;
740
	default: return FALSE;
760
	default: return FALSE;
741
      }
761
      }
742
      case slonghd:
762
      case slonghd:
743
      switch(src_shape){
763
      switch (src_shape) {
744
	case ucharhd:
764
	case ucharhd:
745
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
765
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
746
	return TRUE;
766
	return TRUE;
747
	case uwordhd:
767
	case uwordhd:
748
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
768
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
749
	return TRUE;
769
	return TRUE;
750
	case ulonghd:
770
	case ulonghd:
751
/*	operate_fmt_immediate(i_addl,reg,0,dreg);
771
/*	operate_fmt_immediate(i_addl,reg,0,dreg);
752
	return TRUE;*/
772
	return TRUE;*/
753
	return FALSE;
773
	return FALSE;
754
	/* sign extend */
774
	/* sign extend */
755
#if 0
775
#if 0
756
	case s64hd: 
776
	case s64hd:
757
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
777
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
758
	/*operate_fmt_immediate(i_addl,reg,0,reg);*/
778
	/*operate_fmt_immediate(i_addl,reg,0,reg);*/
759
	return TRUE;
779
	return TRUE;
760
#endif
780
#endif
761
	default:return FALSE;
781
	default:return FALSE;
762
      }
782
      }
763
      case ulonghd:
783
      case ulonghd:
764
      switch(src_shape){
784
      switch (src_shape) {
765
	case scharhd:
785
	case scharhd:
766
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
786
	operate_fmt_immediate(i_zapnot,reg,1,dreg);
767
	return TRUE;
787
	return TRUE;
768
	case swordhd:
788
	case swordhd:
769
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
789
	operate_fmt_immediate(i_zapnot,reg,3,dreg);
Line 776... Line 796...
776
	case s64hd:
796
	case s64hd:
777
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
797
	operate_fmt_immediate(i_zapnot,reg,15,dreg);
778
	return TRUE;
798
	return TRUE;
779
#endif
799
#endif
780
	default: return FALSE
800
	default: return FALSE
781
		   ;
801
		  ;
782
      }
802
      }
783
      default:return FALSE;
803
      default:return FALSE;
784
    }
804
    }
785
  }
805
  }
786
  return FALSE;
806
  return FALSE;
787
}
807
}
788
 
808
 
789
#define OVERFLOW_VALUE 0x02e0000000000000
809
#define OVERFLOW_VALUE 0x02e0000000000000
790
/*
810
/*
791
  Checks for floating point error.  
811
  Checks for floating point error.
-
 
812
 
-
 
813
  This function outputs code to look at the contents of the
-
 
814
  floating  point control register (FPCR) and determine whether
-
 
815
  or not a floating point error has occured.  If an error is
-
 
816
  detected a jump is made to the label specified in no(son(pt(e))).
792
 
817
 
793
  This function outputs code to look at the contents of the 
-
 
794
  floating  point control register (FPCR) and determine whether 
-
 
795
  or not a floating point error has occured.  If an error is 
-
 
796
  detected a jump is made to the label specified in no(son(pt(e))).  
-
 
797
 
-
 
798
  The error status is determined by looking at the summary bit 
818
  The error status is determined by looking at the summary bit
799
  of the FPCR (bit 63) which is a bitwise OR of all the error bits.
819
  of the FPCR (bit 63) which is a bitwise OR of all the error bits.
800
  The errors recognised are : integer overflow,inexact result,
820
  The errors recognised are : integer overflow,inexact result,
801
  underflow,overflow,division by zero, and invalid operation.
821
  underflow,overflow,division by zero, and invalid operation.
802
*/
822
*/
803
#if 0
823
#if 0
804
static void check_exception
824
static void check_exception
805
    PROTO_N ( ( e,sp ) )
-
 
806
    PROTO_T ( exp e X space sp )
825
(exp e, space sp)
807
{
826
{
808
  long trap;
827
  long trap;
809
  int r1,r2;
828
  int r1,r2;
810
  if(!pt(e)){
829
  if (!pt(e)) {
811
    alphafail(NO_ERROR_HANDLER);
830
    alphafail(NO_ERROR_HANDLER);
812
  }
831
  }
813
  trap = trap_label(e);  	/* label of handler */
832
  trap = trap_label(e);  	/* label of handler */
814
  r1 = getfreg(sp.flt);
833
  r1 = getfreg(sp.flt);
815
  r2 = getfreg(guardfreg(r1,sp).flt);
834
  r2 = getfreg(guardfreg(r1,sp).flt);
816
  no_parameter_instructions(i_trapb); 
835
  no_parameter_instructions(i_trapb);
817
  float_op(i_mf_fpcr,r1,r1,r1);    
836
  float_op(i_mf_fpcr,r1,r1,r1);
818
#if 0
837
#if 0
819
  /*float_op(i_mt_fpcr,31,31,31);*/
838
  /*float_op(i_mt_fpcr,31,31,31);*/
820
  float_load_store_immediate(i_ldit,r2,"1.0"); 	/* ?? */
839
  float_load_store_immediate(i_ldit,r2,"1.0"); 	/* ?? */
821
  float_op(i_cpys,r1,r2,r2);/* take the sign bit of the fpcr and append 1.0 */
840
  float_op(i_cpys,r1,r2,r2);/* take the sign bit of the fpcr and append 1.0 */
822
  no_parameter_instructions(i_trapb); 
841
  no_parameter_instructions(i_trapb);
823
  float_branch(i_fblt,r2,trap);
842
  float_branch(i_fblt,r2,trap);
824
#else
843
#else
825
  {
844
  {
826
    baseoff b;
845
    baseoff b;
827
    int rt = getreg(sp.fixed);
846
    int rt = getreg(sp.fixed);
Line 829... Line 848...
829
    b.offset = stack_top;
848
    b.offset = stack_top;
830
    float_load_store(i_stt,r1,b);
849
    float_load_store(i_stt,r1,b);
831
    load_store(i_ldq,rt,b);
850
    load_store(i_ldq,rt,b);
832
    /* now check for overflow (bits 57/55/54/53) */
851
    /* now check for overflow (bits 57/55/54/53) */
833
    operate_fmt_big_immediate(i_and,rt,OVERFLOW_VALUE,rt);
852
    operate_fmt_big_immediate(i_and,rt,OVERFLOW_VALUE,rt);
834
    no_parameter_instructions(i_trapb); 
853
    no_parameter_instructions(i_trapb);
835
    integer_branch(i_bne,rt,trap);
854
    integer_branch(i_bne,rt,trap);
836
  }
855
  }
837
#endif  
-
 
838
}
-
 
839
#endif
856
#endif
-
 
857
}
-
 
858
#endif
840
#define check_exception( e, sp )	( ( void ) 0 )
859
#define check_exception(e, sp)	((void)0)
841
 
860
 
842
#define PLUS_INFINITY 3
861
#define PLUS_INFINITY 3
843
 
862
 
844
void set_up_rounding_mode
863
void set_up_rounding_mode
845
    PROTO_N ( ( val ) )
-
 
846
    PROTO_T ( int val )
864
(int val)
847
{
865
{
848
  return;
866
  return;
849
}
867
}
850
    
868
 
851
  
869
 
852
/*
870
/*
853
  This function returns the appropriate branch instruction 
871
  This function returns the appropriate branch instruction
854
  for the test represented by 'i'
872
  for the test represented by 'i'
855
*/
873
*/
856
static instruction sbranches
874
static instruction sbranches
857
    PROTO_N ( ( i ) )
-
 
858
    PROTO_T ( int i )
875
(int i)
859
{
876
{
860
  switch (i) {
877
  switch (i) {
861
    case  1: 
878
    case  1:
862
    return i_ble;
879
    return i_ble;
863
    case 2: 
880
    case 2:
864
    return i_blt;
881
    return i_blt;
865
    case 3: 
882
    case 3:
866
    return i_bge;
883
    return i_bge;
867
    case 4: 
884
    case 4:
868
    return i_bgt;
885
    return i_bgt;
869
    case 5: 
886
    case 5:
870
    return i_bne;
887
    return i_bne;
871
    case 6: 
888
    case 6:
872
    return i_beq;
889
    return i_beq;
873
    default:
890
    default:
874
    failer("Illegal value for ntest");
891
    failer("Illegal value for ntest");
875
  }
892
  }
876
  return i_ble;
893
  return i_ble;
877
}
894
}
878
 
895
 
879
  
896
 
880
void testunsigned
897
void testunsigned
881
    PROTO_N ( ( r,max,lab,sp ) )
-
 
882
    PROTO_T ( int r X long max X int lab X space sp )
898
(int r, long max, int lab, space sp)
883
{
899
{
884
  int rtmp = getreg(sp.fixed);
900
  int rtmp = getreg(sp.fixed);
885
  operate_fmt_immediate(i_cmpule,r,max,rtmp);
901
  operate_fmt_immediate(i_cmpule,r,max,rtmp);
886
  integer_branch(i_bne,rtmp,lab);
902
  integer_branch(i_bne,rtmp,lab);
887
  return;
903
  return;
888
}
904
}
889
 
905
 
890
  
906
 
891
 
907
 
892
static bool fdouble_comparisons
908
static bool fdouble_comparisons
893
    PROTO_N ( ( ins,i ) )
-
 
894
    PROTO_T ( instruction *ins X int i )
909
(instruction *ins, int i)
895
{
910
{
896
  bool rev = FALSE;
911
  bool rev = FALSE;
897
  switch(i){
912
  switch (i) {
898
    case 1:
913
    case 1:
899
    *ins = i_cmptle;
914
    *ins = i_cmptle;
900
    break;
915
    break;
901
    case 2:
916
    case 2:
902
    *ins = i_cmptlt;
917
    *ins = i_cmptlt;
Line 920... Line 935...
920
    failer("illegal branch");
935
    failer("illegal branch");
921
    break;
936
    break;
922
  }
937
  }
923
  return rev;
938
  return rev;
924
}
939
}
925
    
940
 
926
 
941
 
927
/*
942
/*
928
  This function selects an appropriate compare instruction for
943
  This function selects an appropriate compare instruction for
929
  the test represented by 'i', returning the instruction name in
944
  the test represented by 'i', returning the instruction name in
930
  the 'ins' parameter.  As the set of instructions available does
945
  the 'ins' parameter.  As the set of instructions available does
931
  not directly cover all the required tests, some instructions
946
  not directly cover all the required tests, some instructions
932
  carry out the inverse of the required test.  In these cases, the
947
  carry out the inverse of the required test.  In these cases, the
933
  return value is TRUE, otherwise it is FALSE.
948
  return value is TRUE, otherwise it is FALSE.
934
*/
949
*/
935
static bool comparisons
950
static bool comparisons
936
    PROTO_N ( ( ins,s,i ) )
-
 
937
    PROTO_T ( instruction *ins X shape s X int i )
951
(instruction *ins, shape s, int i)
938
{
952
{
939
  bool rev=FALSE;
953
  bool rev=FALSE;
940
  if((is_signed(s))){
954
  if ((is_signed(s))) {
941
    /* treat pointer as signed (even though it isn't) */
955
    /* treat pointer as signed (even though it isn't) */
942
    switch(i){
956
    switch (i) {
943
      case 1:
957
      case 1:
944
      *ins=i_cmple;
958
      *ins=i_cmple;
945
      break;
959
      break;
946
      case 2:
960
      case 2:
947
      *ins = i_cmplt;
961
      *ins = i_cmplt;
948
      break;
962
      break;
949
      case 3:
963
      case 3:
950
      *ins = i_cmplt;
964
      *ins = i_cmplt;
951
      rev = TRUE;
965
      rev = TRUE;
952
      break;
966
      break;
953
      case 4:
967
      case 4:
954
      *ins = i_cmple;
968
      *ins = i_cmple;
955
      rev = TRUE;
969
      rev = TRUE;
956
      break;
970
      break;
957
      case 5:
971
      case 5:
958
      *ins = i_cmpeq;
972
      *ins = i_cmpeq;
959
      rev = TRUE;
973
      rev = TRUE;
960
      break;
974
      break;
961
      case 6:
975
      case 6:
962
      *ins = i_cmpeq;
976
      *ins = i_cmpeq;
963
      break;
977
      break;
964
      default:
978
      default:
965
      failer("illegal branch");
979
      failer("illegal branch");
966
      break;
980
      break;
967
    }
981
    }
968
  }
982
  }
969
  else{
983
  else{
970
    switch(i){
984
    switch (i) {
971
      case 1:
985
      case 1:
972
      *ins=i_cmpule;
986
      *ins=i_cmpule;
973
      break;
987
      break;
974
      case 2:
988
      case 2:
975
      *ins=i_cmpult;
989
      *ins=i_cmpult;
976
      break;
990
      break;
977
      case 3:
991
      case 3:
978
      *ins=i_cmpult;
992
      *ins=i_cmpult;
979
      rev=TRUE;		/* actually >= */
993
      rev=TRUE;		/* actually >= */
980
      break;
994
      break;
981
      case 4:			
995
      case 4:
982
      *ins=i_cmpule;	/* actually > */
996
      *ins=i_cmpule;	/* actually > */
983
      rev=TRUE;
997
      rev=TRUE;
984
      break;
998
      break;
985
      case 5:
999
      case 5:
986
      *ins = i_cmpeq;
1000
      *ins = i_cmpeq;
Line 994... Line 1008...
994
    }
1008
    }
995
  }
1009
  }
996
  return rev;
1010
  return rev;
997
}
1011
}
998
 
1012
 
999
      
1013
 
1000
 
1014
 
1001
/*
1015
/*
1002
  conditional moves
1016
  conditional moves
1003
*/
1017
*/
1004
static instruction condmove
1018
static instruction condmove
1005
    PROTO_N ( ( i ) )
-
 
1006
    PROTO_T ( int i )
1019
(int i)
1007
{
1020
{
1008
  switch(i){
1021
  switch (i) {
1009
    case 1:
1022
    case 1:
1010
    return i_cmovle;
1023
    return i_cmovle;
1011
    case 2:
1024
    case 2:
1012
    return i_cmovlt;
1025
    return i_cmovlt;
1013
    case 3:
1026
    case 3:
Line 1016... Line 1029...
1016
    return i_cmovgt;
1029
    return i_cmovgt;
1017
    case 5:
1030
    case 5:
1018
    return i_cmovne;
1031
    return i_cmovne;
1019
    case 6:
1032
    case 6:
1020
    return i_cmoveq;
1033
    return i_cmoveq;
1021
    default:
1034
    default:
1022
    failer("Illegal value for ntest");
1035
    failer("Illegal value for ntest");
1023
  }
1036
  }
1024
  return i_cmovle;
1037
  return i_cmovle;
1025
}
1038
}
1026
/*
1039
/*
1027
static instruction fcondmove
1040
static instruction fcondmove
1028
    PROTO_N ( ( i ) )
1041
    PROTO_N ( ( i ) )
1029
    PROTO_T ( int i )
1042
    PROTO_T ( int i )
1030
{
1043
{
1031
  switch(i){
1044
  switch(i){
1032
   case 1:
1045
   case 1:
1033
    return i_fcmovle;
1046
    return i_fcmovle;
1034
   case 2:
1047
   case 2:
1035
    return i_fcmovlt;
1048
    return i_fcmovlt;
Line 1047... Line 1060...
1047
}
1060
}
1048
*/
1061
*/
1049
 
1062
 
1050
 
1063
 
1051
static bool compares
1064
static bool compares
1052
    PROTO_N ( ( ins,s,i ) )
-
 
1053
    PROTO_T ( instruction *ins X shape s X int i )
1065
(instruction *ins, shape s, int i)
1054
{
1066
{
1055
  bool rev=FALSE;
1067
  bool rev=FALSE;
1056
  if (is_signed(s)){
1068
  if (is_signed(s)) {
1057
    /* signed comparison */
1069
    /* signed comparison */
1058
    switch(i){
1070
    switch (i) {
1059
      case 1:
1071
      case 1:
-
 
1072
      *ins= i_cmplt;
-
 
1073
      break;
-
 
1074
      case 2:
-
 
1075
      *ins= i_cmple;
-
 
1076
      break;
-
 
1077
      case 3:
1060
      *ins= i_cmplt;
1078
      *ins= i_cmplt;
1061
      break;
1079
      break;
1062
      case 2:
1080
      case 4:
1063
      *ins= i_cmple;
1081
      *ins= i_cmple;
1064
      break;
1082
      break;
1065
      case 3:
-
 
1066
      *ins= i_cmplt;
-
 
1067
      break;
-
 
1068
      case 4:
-
 
1069
      *ins= i_cmple;
-
 
1070
      break;
-
 
1071
      case 5:
1083
      case 5:
1072
      *ins= i_cmpeq;
1084
      *ins= i_cmpeq;
1073
      break;
1085
      break;
1074
      case 6:
1086
      case 6:
1075
      *ins= i_cmpeq;
1087
      *ins= i_cmpeq;
1076
      break;
1088
      break;
1077
    }
1089
    }
1078
  }
1090
  }
1079
  else{
1091
  else{
1080
    switch(i){
1092
    switch (i) {
1081
      case 1:
1093
      case 1:
1082
      *ins= i_cmpult;
1094
      *ins= i_cmpult;
1083
      break;
1095
      break;
1084
      case 2:
1096
      case 2:
1085
      *ins= i_cmpule;	
1097
      *ins= i_cmpule;
1086
      break;
1098
      break;
1087
      case 3:
1099
      case 3:
1088
      *ins= i_cmpult;
1100
      *ins= i_cmpult;
1089
      rev=TRUE;
1101
      rev=TRUE;
1090
      break;
1102
      break;
1091
      case 4:
1103
      case 4:
1092
      *ins= i_cmpule;
1104
      *ins= i_cmpule;
1093
      rev=TRUE;
1105
      rev=TRUE;
1094
      break;
1106
      break;
1095
      case 5:
1107
      case 5:
1096
      *ins= i_cmpeq;
1108
      *ins= i_cmpeq;
1097
      break;
1109
      break;
1098
      case 6:
1110
      case 6:
1099
      *ins= i_cmpeq;
1111
      *ins= i_cmpeq;
1100
      break;
1112
      break;
1101
    }
1113
    }
1102
  }
1114
  }
1103
  return rev;
1115
  return rev;
1104
}
1116
}
1105
 
1117
 
1106
/*
1118
/*
1107
static instruction fbranches
1119
static instruction fbranches
1108
    PROTO_N ( ( i ) )
1120
    PROTO_N ( ( i ) )
1109
    PROTO_T ( int i )
1121
    PROTO_T ( int i )
1110
{
1122
{
1111
  switch (i) {
1123
  switch (i) {
1112
    case  1: 
1124
    case  1:
1113
    return i_fble;
1125
    return i_fble;
1114
    case 2: 
1126
    case 2:
1115
    return i_fblt;
1127
    return i_fblt;
1116
    case 3: 
1128
    case 3:
1117
    return i_fbge;
1129
    return i_fbge;
1118
    case 4: 
1130
    case 4:
1119
    return i_fbgt;
1131
    return i_fbgt;
1120
    case 5: 
1132
    case 5:
1121
    return i_fbne;
1133
    return i_fbne;
1122
    case 6: 
1134
    case 6:
1123
    return i_fbeq;
1135
    return i_fbeq;
1124
    default:
1136
    default:
1125
    failer("Illegal value for ntest");
1137
    failer("Illegal value for ntest");
1126
  }
1138
  }
1127
}
1139
}
1128
 
1140
 
1129
static instruction fdbranches
1141
static instruction fdbranches
1130
    PROTO_N ( ( i ) )
1142
    PROTO_N ( ( i ) )
1131
    PROTO_T ( int i )
1143
    PROTO_T ( int i )
1132
{
1144
{
1133
  switch (i) {
1145
  switch (i) {
1134
   case  1: 
1146
   case  1:
1135
    return i_fble;
1147
    return i_fble;
1136
   case 2: 
1148
   case 2:
1137
    return i_fblt;
1149
    return i_fblt;
1138
   case 3: 
1150
   case 3:
1139
    return i_fbge;
1151
    return i_fbge;
1140
   case 4: 
1152
   case 4:
1141
    return i_fbgt;
1153
    return i_fbgt;
1142
   case 5: 
1154
   case 5:
1143
    return i_fbne;
1155
    return i_fbne;
1144
   case 6: 
1156
   case 6:
1145
    return i_fbeq;
1157
    return i_fbeq;
1146
   default:
1158
   default:
1147
    failer("Illegal value for ntest");
1159
    failer("Illegal value for ntest");
1148
  }
1160
  }
1149
}
1161
}
Line 1155... Line 1167...
1155
 
1167
 
1156
/*
1168
/*
1157
  count the number of bits set in b.
1169
  count the number of bits set in b.
1158
*/
1170
*/
1159
int bitsin
1171
int bitsin
1160
    PROTO_N ( ( b ) )
-
 
1161
    PROTO_T ( int32 b )
1172
(int32 b)
1162
{
1173
{
1163
  int   n = 0;
1174
  int   n = 0;
1164
  int32  mask = 1;
1175
  int32  mask = 1;
1165
  for (; b != 0;) {
1176
  for (; b != 0;) {
1166
    n += ((b & mask) != 0) ? 1 : 0;
1177
    n += ((b & mask)!= 0)? 1 : 0;
1167
    b &= ~mask;
1178
    b &= ~mask;
1168
    mask = mask << 1;
1179
    mask = mask << 1;
1169
  }
1180
  }
1170
  return n;
1181
  return n;
1171
}
1182
}
1172
 
1183
 
1173
 
1184
 
1174
/*****************************************************************/
1185
/*****************************************************************/
1175
 
1186
 
1176
/*
1187
/*
1177
  Move sizereg bytes to dest from source using movereg 
1188
  Move sizereg bytes to dest from source using movereg
1178
  bytemove is the maximum number of bytes which can be moved 
1189
  bytemove is the maximum number of bytes which can be moved
1179
  in a single instruction if available.  
1190
  in a single instruction if available.
1180
  In order to reduce the time for the operation the function 
1191
  In order to reduce the time for the operation the function
1181
  attempts to use the most appropriate load & store instructions, 
1192
  attempts to use the most appropriate load & store instructions,
1182
  which requires that the number of bytes remaining to be copied 
1193
  which requires that the number of bytes remaining to be copied
1183
  and the alignment of the object be taken into account.  
1194
  and the alignment of the object be taken into account.
1184
  As the code sequence required to generate word (16 bit) 
1195
  As the code sequence required to generate word (16 bit)
1185
  load/store is prohibitively long, these cases are treated 
1196
  load/store is prohibitively long, these cases are treated
1186
  as bytes.
1197
  as bytes.
1187
*/
1198
*/
1188
 
1199
 
1189
 
1200
 
1190
/*
1201
/*
1191
  Without overlap (destination < source)
1202
  Without overlap (destination < source)
1192
*/
1203
*/
1193
void move_dlts
1204
void move_dlts
1194
    PROTO_N ( ( dest,src,sizereg,movereg,bytemove,sp ) )
-
 
1195
    PROTO_T ( int dest X int src X int sizereg X int movereg X int bytemove X space sp )
1205
(int dest, int src, int sizereg, int movereg, int bytemove, space sp)
1196
{
1206
{
1197
 
1207
 
1198
  int qword_lab,lword_lab,word_lab,byte_lab,endlab;
1208
  int qword_lab,lword_lab,word_lab,byte_lab,endlab;
1199
  int rtest = getreg(sp.fixed);
1209
  int rtest = getreg(sp.fixed);
1200
  baseoff b;
1210
  baseoff b;
1201
  b.offset = 0;
1211
  b.offset = 0;
1202
  qword_lab = (bytemove==8)?new_label():-1;
1212
  qword_lab = (bytemove==8)?new_label():-1;
1203
  lword_lab = (bytemove>=4)?new_label():-1;
1213
  lword_lab = (bytemove>=4)?new_label():-1;
1204
  word_lab = (bytemove>=2)?new_label():-1;
1214
  word_lab = (bytemove>=2)?new_label():-1;
1205
  byte_lab = new_label();
1215
  byte_lab = new_label();
1206
  endlab = new_label();
1216
  endlab = new_label();
1207
  switch(bytemove){
1217
  switch (bytemove) {
1208
    case 8 :{
1218
    case 8:{
1209
      set_label(qword_lab);
1219
      set_label(qword_lab);
1210
      operate_fmt_immediate(i_cmplt,sizereg,8,rtest);
1220
      operate_fmt_immediate(i_cmplt,sizereg,8,rtest);
1211
      integer_branch(i_bne,rtest,lword_lab);
1221
      integer_branch(i_bne,rtest,lword_lab);
1212
      b.base = src;
1222
      b.base = src;
1213
      load_store(i_ldq,movereg,b);
1223
      load_store(i_ldq,movereg,b);
1214
      b.base = dest;
1224
      b.base = dest;
1215
      load_store(i_stq,movereg,b);
1225
      load_store(i_stq,movereg,b);
1216
      operate_fmt_immediate(i_addq,src,8,src);
1226
      operate_fmt_immediate(i_addq,src,8,src);
1217
      operate_fmt_immediate(i_addq,dest,8,dest);
1227
      operate_fmt_immediate(i_addq,dest,8,dest);
1218
      operate_fmt_immediate(i_subq,sizereg,8,sizereg);
1228
      operate_fmt_immediate(i_subq,sizereg,8,sizereg);
1219
      integer_branch(i_beq,sizereg,endlab);
1229
      integer_branch(i_beq,sizereg,endlab);
1220
      integer_branch(i_br,31,qword_lab);
1230
      integer_branch(i_br,31,qword_lab);
1221
    }
1231
    }
1222
    FALL_THROUGH;
1232
    FALL_THROUGH;
1223
    case 4 :{
1233
    case 4:{
1224
      set_label(lword_lab);
1234
      set_label(lword_lab);
1225
      operate_fmt_immediate(i_cmplt,sizereg,4,rtest);
1235
      operate_fmt_immediate(i_cmplt,sizereg,4,rtest);
1226
      integer_branch(i_bne,rtest,byte_lab);
1236
      integer_branch(i_bne,rtest,byte_lab);
1227
      b.base = src;
1237
      b.base = src;
1228
      load_store(i_ldl,movereg,b);
1238
      load_store(i_ldl,movereg,b);
1229
      b.base = dest;
1239
      b.base = dest;
1230
      load_store(i_stq,movereg,b);
1240
      load_store(i_stq,movereg,b);
1231
      operate_fmt_immediate(i_addq,src,4,src);
1241
      operate_fmt_immediate(i_addq,src,4,src);
1232
      operate_fmt_immediate(i_addq,dest,4,dest);
1242
      operate_fmt_immediate(i_addq,dest,4,dest);
1233
      operate_fmt_immediate(i_subq,sizereg,4,sizereg);
1243
      operate_fmt_immediate(i_subq,sizereg,4,sizereg);
1234
      integer_branch(i_beq,sizereg,endlab);
1244
      integer_branch(i_beq,sizereg,endlab);
1235
      integer_branch(i_br,31,lword_lab);
1245
      integer_branch(i_br,31,lword_lab);
1236
    }
1246
    }
1237
    FALL_THROUGH;
1247
    FALL_THROUGH;
1238
    case 2 :	
1248
    case 2:
1239
    FALL_THROUGH;
1249
    FALL_THROUGH;
1240
    case 1 :{
1250
    case 1:{
1241
      int rtmp = getreg(sp.fixed);
1251
      int rtmp = getreg(sp.fixed);
1242
      int rtmp2 = getreg(sp.fixed);
1252
      int rtmp2 = getreg(sp.fixed);
1243
      set_label(byte_lab);
1253
      set_label(byte_lab);
1244
      integer_branch(i_beq,sizereg,endlab);
1254
      integer_branch(i_beq,sizereg,endlab);
1245
      b.base=src;
1255
      b.base=src;
Line 1268... Line 1278...
1268
 
1278
 
1269
/*
1279
/*
1270
  With overlap (destination > src)
1280
  With overlap (destination > src)
1271
*/
1281
*/
1272
void move_dgts
1282
void move_dgts
1273
    PROTO_N ( ( dest,src,sizereg,movereg,bytemove,sp ) )
-
 
1274
    PROTO_T ( int dest X int src X int sizereg X int movereg X int bytemove X space sp )
1283
(int dest, int src, int sizereg, int movereg, int bytemove, space sp)
1275
{
1284
{
1276
  int qword_lab,lword_lab,word_lab,byte_lab,endlab;
1285
  int qword_lab,lword_lab,word_lab,byte_lab,endlab;
1277
  int rtest = getreg(sp.fixed);
1286
  int rtest = getreg(sp.fixed);
1278
  baseoff b;
1287
  baseoff b;
1279
  b.offset = 0;
1288
  b.offset = 0;
Line 1282... Line 1291...
1282
  word_lab = (bytemove>=2)?new_label():-1;
1291
  word_lab = (bytemove>=2)?new_label():-1;
1283
  byte_lab = new_label();
1292
  byte_lab = new_label();
1284
  endlab = new_label();
1293
  endlab = new_label();
1285
  operate_fmt(i_addq,dest,sizereg,dest);
1294
  operate_fmt(i_addq,dest,sizereg,dest);
1286
  operate_fmt(i_addq,src,sizereg,src);
1295
  operate_fmt(i_addq,src,sizereg,src);
1287
  switch(bytemove){
1296
  switch (bytemove) {
1288
    case 8 :{
1297
    case 8:{
1289
      b.offset = -8;
1298
      b.offset = -8;
1290
      set_label(qword_lab);
1299
      set_label(qword_lab);
1291
      operate_fmt_immediate(i_cmplt,sizereg,8,rtest);
1300
      operate_fmt_immediate(i_cmplt,sizereg,8,rtest);
1292
      integer_branch(i_bne,rtest,lword_lab);
1301
      integer_branch(i_bne,rtest,lword_lab);
1293
      b.base = src;
1302
      b.base = src;
1294
      load_store(i_ldq,movereg,b);
1303
      load_store(i_ldq,movereg,b);
1295
      b.base = dest;
1304
      b.base = dest;
1296
      load_store(i_stq,movereg,b);
1305
      load_store(i_stq,movereg,b);
1297
      operate_fmt_immediate(i_subq,src,8,src);
1306
      operate_fmt_immediate(i_subq,src,8,src);
1298
      operate_fmt_immediate(i_subq,dest,8,dest);
1307
      operate_fmt_immediate(i_subq,dest,8,dest);
1299
      operate_fmt_immediate(i_subq,sizereg,8,sizereg);
1308
      operate_fmt_immediate(i_subq,sizereg,8,sizereg);
1300
      integer_branch(i_beq,sizereg,endlab);
1309
      integer_branch(i_beq,sizereg,endlab);
1301
      integer_branch(i_br,31,qword_lab);
1310
      integer_branch(i_br,31,qword_lab);
1302
    }
1311
    }
1303
    FALL_THROUGH;
1312
    FALL_THROUGH;
1304
    case 4 :{
1313
    case 4:{
1305
      b.offset = -4;
1314
      b.offset = -4;
1306
      set_label(lword_lab);
1315
      set_label(lword_lab);
1307
      operate_fmt_immediate(i_cmplt,sizereg,4,rtest);
1316
      operate_fmt_immediate(i_cmplt,sizereg,4,rtest);
1308
      integer_branch(i_bne,rtest,byte_lab);
1317
      integer_branch(i_bne,rtest,byte_lab);
1309
      b.base = src;
1318
      b.base = src;
Line 1311... Line 1320...
1311
      b.base = dest;
1320
      b.base = dest;
1312
      load_store(i_stq,movereg,b);
1321
      load_store(i_stq,movereg,b);
1313
      operate_fmt_immediate(i_subq,src,4,src);
1322
      operate_fmt_immediate(i_subq,src,4,src);
1314
      operate_fmt_immediate(i_subq,dest,4,dest);
1323
      operate_fmt_immediate(i_subq,dest,4,dest);
1315
      operate_fmt_immediate(i_subq,sizereg,4,sizereg);
1324
      operate_fmt_immediate(i_subq,sizereg,4,sizereg);
1316
      integer_branch(i_beq,sizereg,endlab);
1325
      integer_branch(i_beq,sizereg,endlab);
1317
      integer_branch(i_br,31,lword_lab);
1326
      integer_branch(i_br,31,lword_lab);
1318
    }
1327
    }
1319
    FALL_THROUGH;
1328
    FALL_THROUGH;
1320
    case 2 :	
1329
    case 2:
1321
    FALL_THROUGH;
1330
    FALL_THROUGH;
1322
    case 1 :{
1331
    case 1:{
1323
      int rtmp = getreg(sp.fixed);
1332
      int rtmp = getreg(sp.fixed);
1324
      int rtmp2 = getreg(sp.fixed);
1333
      int rtmp2 = getreg(sp.fixed);
1325
      b.offset = -1;
1334
      b.offset = -1;
1326
      set_label(byte_lab);
1335
      set_label(byte_lab);
1327
      integer_branch(i_beq,sizereg,endlab);
1336
      integer_branch(i_beq,sizereg,endlab);
Line 1347... Line 1356...
1347
  set_label(endlab);
1356
  set_label(endlab);
1348
  return;
1357
  return;
1349
}
1358
}
1350
 
1359
 
1351
/****************************************************************/
1360
/****************************************************************/
1352
            
-
 
1353
 
1361
 
1354
 
1362
 
-
 
1363
 
1355
     
1364
 
1356
static void reset_tos
1365
static void reset_tos
1357
    PROTO_Z ()
1366
(void)
1358
{
1367
{
1359
  if (Has_tos) { 
1368
  if (Has_tos) {
1360
    baseoff b;
1369
    baseoff b;
1361
    b.base = FP;
1370
    b.base = FP;
1362
    b.offset = -((PTR_SZ>>3)*2) - arg_stack_space;
1371
    b.offset = - ((PTR_SZ>>3)*2) - arg_stack_space;
1363
    load_store(i_stq,SP,b);
1372
    load_store(i_stq,SP,b);
1364
  }
1373
  }
1365
  return;
1374
  return;
1366
}
1375
}
1367
  
1376
 
1368
  
1377
 
1369
 
1378
 
1370
/*
1379
/*
1371
  This function finds the last test in the sequence e which is 
1380
  This function finds the last test in the sequence e which is
1372
  a branch to second, if any exists, otherwise it returns nil.
1381
  a branch to second, if any exists, otherwise it returns nil.
1373
*/
1382
*/
1374
static exp testlast
1383
static exp testlast
1375
    PROTO_N ( ( e, second ) )
-
 
1376
    PROTO_T ( exp e X exp second )
1384
(exp e, exp second)
1377
{
1385
{
1378
  if (name (e) == test_tag && pt (e) == second) {
1386
  if (name(e) == test_tag && pt(e) == second) {
1379
    return (e);
1387
    return(e);
1380
  }
1388
  }
1381
  if (name (e) == seq_tag) {
1389
  if (name(e) == seq_tag) {
1382
    if (name (bro (son (e))) == test_tag && pt (bro (son (e))) == second) {
1390
    if (name(bro(son(e))) == test_tag && pt(bro(son(e))) == second) {
1383
      return bro (son (e));
1391
      return bro(son(e));
1384
    }
1392
    }
1385
    else if (name (bro (son (e))) == top_tag) {
1393
    else if (name(bro(son(e))) == top_tag) {
1386
      exp list = son (son (e));
1394
      exp list = son(son(e));
1387
      for (;;) {
1395
      for (;;) {
1388
	if (last (list)) {
1396
	if (last(list)) {
1389
	  if (name (list) == test_tag && pt (list) == second) {
1397
	  if (name(list) == test_tag && pt(list) == second) {
1390
	    return list;
1398
	    return list;
1391
	  }
1399
	  }
1392
	  else {
1400
	  else {
1393
	    return 0;
1401
	    return 0;
1394
	  }
1402
	  }
1395
	}
1403
	}
1396
	else {
1404
	else {
1397
	  list = bro (list);
1405
	  list = bro(list);
1398
	}
1406
	}
1399
      }
1407
      }
1400
    }
1408
    }
1401
  }
1409
  }
1402
  return 0;
1410
  return 0;
1403
}
1411
}
1404
 
1412
 
1405
 
1413
 
1406
bool last_param
1414
bool last_param
1407
    PROTO_N ( ( e ) )
-
 
1408
    PROTO_T ( exp e )
1415
(exp e)
1409
{
1416
{
1410
  bool res=0;
1417
  bool res=0;
1411
  if (isparam(e)){
1418
  if (isparam(e)) {
1412
    e = bro(son(e));
1419
    e = bro(son(e));
1413
    while(name(e) == diagnose_tag)
1420
    while (name(e) == diagnose_tag)
1414
      e = son(e);
1421
      e = son(e);
1415
    if((name(e) != ident_tag) || !isparam(e) || 
1422
    if ((name(e)!= ident_tag) || !isparam(e) ||
1416
       name(son(e))==formal_callee_tag)
1423
       name(son(e)) ==formal_callee_tag)
1417
      res=1;
1424
      res=1;
1418
  }
1425
  }
1419
  return res;
1426
  return res;
1420
}
1427
}
1421
 
1428
 
1422
 
1429
 
1423
void test_unsigned
1430
void test_unsigned
1424
    PROTO_N ( ( reg,upper,trap ) )
-
 
1425
    PROTO_T ( int reg X unsigned long upper X unsigned trap )
1431
(int reg, unsigned long upper, unsigned trap)
1426
{
1432
{
1427
  setnoat();
1433
  setnoat();
1428
  operate_fmt_big_immediate(i_cmpule,reg,upper,AT);
1434
  operate_fmt_big_immediate(i_cmpule,reg,upper,AT);
1429
  integer_branch(i_beq,AT,trap);
1435
  integer_branch(i_beq,AT,trap);
1430
  setat();
1436
  setat();
1431
  return;
1437
  return;
1432
}
1438
}
1433
 
1439
 
1434
void test_signed
1440
void test_signed
1435
    PROTO_N ( ( reg,lower,upper,trap ) )
-
 
1436
    PROTO_T ( int reg X long lower X long upper X int trap )
1441
(int reg, long lower, long upper, int trap)
1437
{
1442
{
1438
  setnoat();
1443
  setnoat();
1439
  operate_fmt_big_immediate(i_cmplt,reg,lower,AT);
1444
  operate_fmt_big_immediate(i_cmplt,reg,lower,AT);
1440
  integer_branch(i_bne,AT,trap);
1445
  integer_branch(i_bne,AT,trap);
1441
  operate_fmt_big_immediate(i_cmple,reg,upper,AT);
1446
  operate_fmt_big_immediate(i_cmple,reg,upper,AT);
Line 1444... Line 1449...
1444
  return;
1449
  return;
1445
}
1450
}
1446
 
1451
 
1447
 
1452
 
1448
void test_signed_and_trap
1453
void test_signed_and_trap
1449
    PROTO_N ( ( reg,lower,upper,except ) )
-
 
1450
    PROTO_T ( int reg X long lower X long upper X int except )
1454
(int reg, long lower, long upper, int except)
1451
{
1455
{
1452
  int ok_lab = new_label();
1456
  int ok_lab = new_label();
1453
  int jump_label = new_label();
1457
  int jump_label = new_label();
1454
    
1458
 
1455
  setnoat();
1459
  setnoat();
1456
  operate_fmt_big_immediate(i_cmplt,reg,lower,AT);
1460
  operate_fmt_big_immediate(i_cmplt,reg,lower,AT);
1457
  integer_branch(i_bne,AT,jump_label);
1461
  integer_branch(i_bne,AT,jump_label);
1458
  operate_fmt_big_immediate(i_cmple,reg,upper,AT);
1462
  operate_fmt_big_immediate(i_cmple,reg,upper,AT);
1459
  integer_branch(i_beq,AT,jump_label);
1463
  integer_branch(i_beq,AT,jump_label);
1460
  setat();
1464
  setat();
1461
  integer_branch(i_br,31,ok_lab);
1465
  integer_branch(i_br,31,ok_lab);
1462
  set_label(jump_label);
1466
  set_label(jump_label);
1463
  do_exception(except);
1467
  do_exception(except);
1464
  set_label(ok_lab);
1468
  set_label(ok_lab);
1465
  return;
1469
  return;
1466
}
1470
}
1467
 
1471
 
1468
void test_unsigned_and_trap
1472
void test_unsigned_and_trap
1469
    PROTO_N ( ( reg,upper,except ) )
-
 
1470
    PROTO_T ( int reg X unsigned long upper X unsigned except )
1473
(int reg, unsigned long upper, unsigned except)
1471
{
1474
{
1472
  int ok_lab = new_label();
1475
  int ok_lab = new_label();
1473
  setnoat();
1476
  setnoat();
1474
  operate_fmt_big_immediate(i_cmpule,reg,upper,AT);
1477
  operate_fmt_big_immediate(i_cmpule,reg,upper,AT);
1475
  integer_branch(i_bne,AT,ok_lab);
1478
  integer_branch(i_bne,AT,ok_lab);
1476
  setat();
1479
  setat();
1477
  do_exception(except);
1480
  do_exception(except);
1478
  set_label(ok_lab);
1481
  set_label(ok_lab);
1479
  return;
1482
  return;
1480
}
1483
}
1481
 
1484
 
1482
 
1485
 
1483
 
1486
 
1484
 
1487
 
1485
/*
1488
/*
1486
  This function returns a register for use as a destination operand.
1489
  This function returns a register for use as a destination operand.
1487
  If the final destination is in a register then that register is 
1490
  If the final destination is in a register then that register is
1488
  returned, otherwise a new register is selected from the pool.
1491
  returned, otherwise a new register is selected from the pool.
1489
*/
1492
*/
1490
int regfrmdest
1493
int regfrmdest
1491
    PROTO_N ( ( dest, sp ) )
-
 
1492
    PROTO_T ( where *dest X space sp )
1494
(where *dest, space sp)
1493
{
1495
{
1494
  switch (dest->answhere.discrim) {
1496
  switch (dest->answhere.discrim) {
1495
    case inreg :{
1497
    case inreg:{
1496
      return regalt (dest->answhere);
1498
      return regalt(dest->answhere);
1497
    }
1499
    }
1498
    default :{
1500
    default :{
1499
      return getreg (sp.fixed);
1501
      return getreg(sp.fixed);
1500
    }
1502
    }
1501
  }
1503
  }
1502
}	
1504
}
1503
 
1505
 
1504
 
1506
 
1505
freg fregfrmdest
1507
freg fregfrmdest
1506
    PROTO_N ( ( dest,sp ) )
-
 
1507
    PROTO_T ( where *dest X space sp )
1508
(where *dest, space sp)
1508
{
1509
{
1509
  switch (dest->answhere.discrim) {
1510
  switch (dest->answhere.discrim) {
1510
    case infreg : {
1511
    case infreg: {
1511
      return fregalt(dest->answhere);
1512
      return fregalt(dest->answhere);
1512
    }
1513
    }
1513
    default : {
1514
    default : {
1514
      freg fr;
1515
      freg fr;
1515
      fr.fr = getfreg(sp.flt);
1516
      fr.fr = getfreg(sp.flt);
Line 1519... Line 1520...
1519
  }
1520
  }
1520
}
1521
}
1521
 
1522
 
1522
 
1523
 
1523
/*
1524
/*
1524
  Divide dividend by divisor using the divide instructions supplied 
1525
  Divide dividend by divisor using the divide instructions supplied
1525
  by the the assembler.  These divide instructions corrupt the t-regs
1526
  by the the assembler.  These divide instructions corrupt the t-regs
1526
  23,24,25,27(PV), and 28(AT) which have to be protected if in use.
1527
  23,24,25,27(PV), and 28(AT) which have to be protected if in use.
1527
  Returns result register.
1528
  Returns result register.
1528
*/
1529
*/
1529
static int divide_using_div
1530
static int divide_using_div
1530
    PROTO_N ( ( div,dividend,divisor,dest,sp,div_ins ) )
-
 
1531
    PROTO_T ( exp div X exp dividend X exp divisor X where dest X space sp X instruction div_ins )
1531
(exp div, exp dividend, exp divisor, where dest, space sp, instruction div_ins)
1532
{
1532
{
1533
  int r_result;
1533
  int r_result;
1534
  space newsp;
1534
  space newsp;
1535
  int r_dividend,r_divisor;
1535
  int r_dividend,r_divisor;
1536
  int uns;
1536
  int uns;
1537
  newsp = guardreg(AT,sp);
1537
  newsp = guardreg(AT,sp);
1538
  uns = !is_signed(sh(dividend));
1538
  uns = !is_signed(sh(dividend));
1539
  r_result = regfrmdest(&dest,newsp);
1539
  r_result = regfrmdest(&dest,newsp);
1540
  if(r_result == NO_REG) {
1540
  if (r_result == NO_REG) {
1541
    r_result = getreg(newsp.fixed);
1541
    r_result = getreg(newsp.fixed);
1542
  }
1542
  }
1543
  newsp = guardreg(r_result,newsp);
1543
  newsp = guardreg(r_result,newsp);
1544
  r_dividend = reg_operand(dividend,newsp);
1544
  r_dividend = reg_operand(dividend,newsp);
1545
  clear_reg(AT),clear_reg(23),clear_reg(24),clear_reg(25),clear_reg(27);
1545
  clear_reg(AT),clear_reg(23),clear_reg(24),clear_reg(25),clear_reg(27);
1546
  newsp = guardreg(r_dividend,newsp);
1546
  newsp = guardreg(r_dividend,newsp);
1547
  if(r_result == NO_REG) r_result = getreg(newsp.fixed);
1547
  if (r_result == NO_REG)r_result = getreg(newsp.fixed);
1548
  if(name(divisor) == val_tag && optop(div)){
1548
  if (name(divisor) == val_tag && optop(div)) {
1549
    r_divisor = no(divisor);
1549
    r_divisor = no(divisor);
1550
  }
1550
  }
1551
  else{
1551
  else{
1552
    r_divisor = reg_operand(divisor,newsp);
1552
    r_divisor = reg_operand(divisor,newsp);
1553
  }
1553
  }
1554
  if (!optop(div) && !error_treatment_is_trap(div)) {
1554
  if (!optop(div) && !error_treatment_is_trap(div)) {
1555
    /* test for (-inf)/-1 and /0 */
1555
    /* test for (-inf)/-1 and /0 */
1556
    int over = new_label();
1556
    int over = new_label();
1557
    int trap = trap_label(div);
1557
    int trap = trap_label(div);
1558
    integer_branch(i_beq,r_divisor,trap);
1558
    integer_branch(i_beq,r_divisor,trap);
1559
    if(!(is_signed(sh(div)))) {
1559
    if (!(is_signed(sh(div)))) {
1560
      int rt=getreg(newsp.fixed);
1560
      int rt=getreg(newsp.fixed);
1561
      comment(" check unsigned overflow ");
1561
      comment(" check unsigned overflow ");
1562
      operate_fmt_immediate(i_cmpeq,r_divisor,-1,rt);
1562
      operate_fmt_immediate(i_cmpeq,r_divisor,-1,rt);
1563
      integer_branch(i_bne,rt,trap);
1563
      integer_branch(i_bne,rt,trap);
1564
      set_label(over);
1564
      set_label(over);
1565
    }
1565
    }
1566
  }
1566
  }
1567
 
1567
 
1568
  if(!optop(div) && is_signed(sh(div)) && (is64(sh(div)) || is32(sh(div)))){
1568
  if (!optop(div) && is_signed(sh(div)) && (is64(sh(div)) || is32(sh(div)))) {
1569
    int continue_lab = new_label();
1569
    int continue_lab = new_label();
1570
    setnoat();
1570
    setnoat();
1571
    operate_fmt_immediate(i_cmpeq,r_divisor,-1,AT);
1571
    operate_fmt_immediate(i_cmpeq,r_divisor,-1,AT);
1572
    integer_branch(i_beq,AT,continue_lab);
1572
    integer_branch(i_beq,AT,continue_lab);
1573
    operate_fmt_big_immediate(i_cmpeq,r_dividend,maxmin(sh(div)).mini,AT);
1573
    operate_fmt_big_immediate(i_cmpeq,r_dividend,maxmin(sh(div)).mini,AT);
1574
    integer_branch(i_beq,AT,continue_lab);
1574
    integer_branch(i_beq,AT,continue_lab);
1575
    if(error_treatment_is_trap(div)){
1575
    if (error_treatment_is_trap(div)) {
1576
      do_exception(f_overflow);
1576
      do_exception(f_overflow);
1577
    }
1577
    }
1578
    else{
1578
    else{
1579
      integer_branch(i_br,31,trap_label(div));
1579
      integer_branch(i_br,31,trap_label(div));
1580
    }
1580
    }
1581
    set_label(continue_lab);
1581
    set_label(continue_lab);
1582
    setat();
1582
    setat();
1583
  }
1583
  }
1584
  
1584
 
1585
  if((name(divisor) != val_tag) || !optop(div)){
1585
  if ((name(divisor)!= val_tag) || !optop(div)) {
1586
    operate_fmt(div_ins,r_dividend,r_divisor,r_result);
1586
    operate_fmt(div_ins,r_dividend,r_divisor,r_result);
1587
  }
1587
  }
1588
  else{
1588
  else{
1589
    operate_fmt_immediate(div_ins,r_dividend,r_divisor,r_result);
1589
    operate_fmt_immediate(div_ins,r_dividend,r_divisor,r_result);
1590
  }
1590
  }
1591
  if(name(div) == div1_tag){
1591
  if (name(div) == div1_tag) {
1592
    int rem_neg = new_label();
1592
    int rem_neg = new_label();
1593
    int exitlab = new_label();
1593
    int exitlab = new_label();
1594
    int rrem = getreg(newsp.fixed);
1594
    int rrem = getreg(newsp.fixed);
1595
    if((name(divisor) != val_tag) || !optop(div)) {
1595
    if ((name(divisor)!= val_tag) || !optop(div)) {
1596
      operate_fmt(((uns)?((is64(sh(div)))?i_remqu:i_remlu):
1596
      operate_fmt(((uns)?((is64(sh(div)))?i_remqu:i_remlu):
1597
		   (is64(sh(div)))?i_remq:i_reml),
1597
		  (is64(sh(div)))?i_remq:i_reml),
1598
		  r_dividend,r_divisor,rrem);
1598
		  r_dividend,r_divisor,rrem);
1599
    }
1599
    }
1600
    else {
1600
    else {
1601
      operate_fmt_immediate(((uns)?((is64(sh(div)))?i_remqu:i_remlu):
1601
      operate_fmt_immediate(((uns)?((is64(sh(div)))?i_remqu:i_remlu):
1602
			     (is64(sh(div)))?i_remq:i_reml),
1602
			    (is64(sh(div)))?i_remq:i_reml),
1603
			    r_dividend,r_divisor,rrem);
1603
			    r_dividend,r_divisor,rrem);
1604
    }
1604
    }
1605
    
1605
 
1606
    integer_branch(i_beq,rrem,exitlab);
1606
    integer_branch(i_beq,rrem,exitlab);
1607
    integer_branch(i_blt,rrem,rem_neg);
1607
    integer_branch(i_blt,rrem,rem_neg);
1608
    /*set_label(rem_pos);*/
1608
    /*set_label(rem_pos);*/
1609
    integer_branch(i_bge,r_divisor,exitlab);
1609
    integer_branch(i_bge,r_divisor,exitlab);
1610
    operate_fmt_immediate((is64(sh(div)))?i_addq:i_addl,r_result,-1,r_result);
1610
    operate_fmt_immediate((is64(sh(div)))?i_addq:i_addl,r_result,-1,r_result);
Line 1612... Line 1612...
1612
    set_label(rem_neg);
1612
    set_label(rem_neg);
1613
    integer_branch(i_ble,r_divisor,exitlab);
1613
    integer_branch(i_ble,r_divisor,exitlab);
1614
    operate_fmt_immediate((is64(sh(div)))?i_addq:i_addl,r_result,-1,r_result);
1614
    operate_fmt_immediate((is64(sh(div)))?i_addq:i_addl,r_result,-1,r_result);
1615
    set_label(exitlab);
1615
    set_label(exitlab);
1616
  }
1616
  }
1617
  if(!optop(div)) {
1617
  if (!optop(div)) {
1618
    switch(name(sh(div))){
1618
    switch (name(sh(div))) {
1619
      case ucharhd :{
1619
      case ucharhd:{
1620
	if(error_treatment_is_trap(div)){
1620
	if (error_treatment_is_trap(div)) {
1621
	  test_unsigned_and_trap(r_result,255,f_overflow);
1621
	  test_unsigned_and_trap(r_result,255,f_overflow);
1622
	}
1622
	}
1623
	else {
1623
	else {
1624
	  test_unsigned(r_result,255,trap_label(div));
1624
	  test_unsigned(r_result,255,trap_label(div));
1625
	}
1625
	}
1626
	break;
1626
	break;
1627
      }
1627
      }
1628
      case scharhd :{
1628
      case scharhd:{
1629
	if(error_treatment_is_trap(div)){
1629
	if (error_treatment_is_trap(div)) {
1630
	  test_signed_and_trap(r_result,-128,127,f_overflow);
1630
	  test_signed_and_trap(r_result,-128,127,f_overflow);
1631
	}
1631
	}
1632
	else{
1632
	else{
1633
	  test_signed(r_result,-128,127,trap_label(div));
1633
	  test_signed(r_result,-128,127,trap_label(div));
1634
	}
1634
	}
1635
	break;
1635
	break;
1636
      }
1636
      }
1637
      case uwordhd :{
1637
      case uwordhd:{
1638
	if(error_treatment_is_trap(div)){
1638
	if (error_treatment_is_trap(div)) {
1639
	  test_unsigned_and_trap(r_result,0xffff,f_overflow);
1639
	  test_unsigned_and_trap(r_result,0xffff,f_overflow);
1640
	}
1640
	}
1641
	else {
1641
	else {
1642
	  test_unsigned(r_result,0xffff,trap_label(div));
1642
	  test_unsigned(r_result,0xffff,trap_label(div));
1643
	}
1643
	}
1644
	break;
1644
	break;
1645
      }
1645
      }
1646
      case swordhd : {
1646
      case swordhd: {
1647
	if(error_treatment_is_trap(div)){
1647
	if (error_treatment_is_trap(div)) {
1648
	  test_signed_and_trap(r_result,-0x8000,0x7fff,f_overflow);
1648
	  test_signed_and_trap(r_result,-0x8000,0x7fff,f_overflow);
1649
	}
1649
	}
1650
	else {
1650
	else {
1651
	  test_signed(r_result,-0x8000,0x7fff,trap_label(div));
1651
	  test_signed(r_result,-0x8000,0x7fff,trap_label(div));
1652
	}
1652
	}
1653
	break;
1653
	break;
1654
      }
1654
      }
1655
      case ulonghd :{
1655
      case ulonghd:{
1656
	if(error_treatment_is_trap(div)){
1656
	if (error_treatment_is_trap(div)) {
1657
	  test_unsigned_and_trap(r_result,0xffffffff,f_overflow);
1657
	  test_unsigned_and_trap(r_result,0xffffffff,f_overflow);
1658
	}
1658
	}
1659
	else{
1659
	else{
1660
	  test_unsigned(r_result,0xffffffff,trap_label(div));
1660
	  test_unsigned(r_result,0xffffffff,trap_label(div));
1661
	}
1661
	}
1662
	break;
1662
	break;
1663
      }
1663
      }
1664
      case slonghd :{
1664
      case slonghd:{
1665
	if(error_treatment_is_trap(div)){
1665
	if (error_treatment_is_trap(div)) {
1666
	  test_signed_and_trap(r_result,-0x80000000L,0x7fffffff,f_overflow);
1666
	  test_signed_and_trap(r_result,-0x80000000L,0x7fffffff,f_overflow);
1667
	}
1667
	}
1668
	else{
1668
	else{
1669
	  test_signed(r_result,-0x80000000L,0x7fffffff,trap_label(div));
1669
	  test_signed(r_result,-0x80000000L,0x7fffffff,trap_label(div));
1670
	}
1670
	}
1671
	break;
1671
	break;
1672
      }
1672
      }
1673
      case s64hd :{
1673
      case s64hd:{
1674
	if(error_treatment_is_trap(div)){
1674
	if (error_treatment_is_trap(div)) {
1675
	  test_signed_and_trap(r_result,-0x8000000000000000L,0x7fffffffffffffffL
1675
	  test_signed_and_trap(r_result,-0x8000000000000000L,0x7fffffffffffffffL
1676
			       ,f_overflow);  
1676
			       ,f_overflow);
1677
	}
1677
	}
1678
	else{
1678
	else{
1679
	  test_signed(r_result,-0x8000000000000000L,0x7fffffffffffffffL
1679
	  test_signed(r_result,-0x8000000000000000L,0x7fffffffffffffffL
1680
		      ,trap_label(div));
1680
		      ,trap_label(div));
1681
	}
1681
	}
1682
	break;
1682
	break;
1683
      }
1683
      }
1684
      case u64hd :{
1684
      case u64hd:{
1685
	if(error_treatment_is_trap(div)){
1685
	if (error_treatment_is_trap(div)) {
1686
	  test_unsigned_and_trap(r_result,0xffffffffffffffffL,f_overflow);
1686
	  test_unsigned_and_trap(r_result,0xffffffffffffffffL,f_overflow);
1687
	}
1687
	}
1688
	else{
1688
	else{
1689
	  test_unsigned(r_result,0xffffffffffffffffL,trap_label(div));
1689
	  test_unsigned(r_result,0xffffffffffffffffL,trap_label(div));
1690
	}
1690
	}
1691
	break;
1691
	break;
1692
      }
1692
      }
1693
      default:failer("Illegal shape in div");
1693
      default:failer("Illegal shape in div");
1694
    }
1694
    }
1695
  }
1695
  }
1696
  return r_result;
1696
  return r_result;
1697
}
1697
}
1698
 
1698
 
1699
  
1699
 
1700
static int proc_has_vararg;
1700
static int proc_has_vararg;
1701
 
1701
 
1702
 
1702
 
1703
/*
1703
/*
1704
  Process a parameter list 
1704
  Process a parameter list
1705
*/
1705
*/
1706
space do_callers
1706
space do_callers
1707
    PROTO_N ( ( list,sp,sizecallers ) )
-
 
1708
    PROTO_T ( exp list X space sp X int *sizecallers )
1707
(exp list, space sp, int *sizecallers)
1709
{
1708
{
1710
  int disp;
1709
  int disp;
1711
  int spar;
1710
  int spar;
1712
  int fpar = 16;
1711
  int fpar = 16;
1713
  ash ansash;
1712
  ash ansash;
1714
  bool hadfixed;
1713
  bool hadfixed;
1715
  instore is;
1714
  instore is;
1716
  is.b.base = SP;
1715
  is.b.base = SP;
1717
  is.b.offset = 0;
1716
  is.b.offset = 0;
1718
  is.adval = 1;
1717
  is.adval = 1;
1719
       
1718
 
1720
#ifdef DO_SPECIAL
1719
#ifdef DO_SPECIAL
1721
  if ((disp = specialfn (fn)) > 0) { /* eg function is strlen */
1720
  if ((disp = specialfn (fn)) > 0) { /* eg function is strlen */
1722
    mka.lab = specialmake (disp, list, sp, dest, exitlab);
1721
    mka.lab = specialmake(disp, list, sp, dest, exitlab);
1723
    return mka;
1722
    return mka;
1724
  }
1723
  }
1725
#endif
1724
#endif
1726
  ansash = ashof (sh (list));
1725
  ansash = ashof(sh(list));
1727
  disp = 0;
1726
  disp = 0;
1728
  spar = FIRST_INT_ARG;/* register holding 1st integer parameter */
1727
  spar = FIRST_INT_ARG;/* register holding 1st integer parameter */
1729
  hadfixed = 0;
1728
  hadfixed = 0;
1730
  for (;;) {		/* evaluate parameters in turn */
1729
  for (;;) {		/* evaluate parameters in turn */
1731
    int   hd = name (sh (list));
1730
    int   hd = name(sh(list));
1732
    where w;
1731
    where w;
1733
    ash ap;
1732
    ash ap;
1734
    int paral;
1733
    int paral;
1735
    int parsize;
1734
    int parsize;
1736
    ap = ashof (sh (list));
1735
    ap = ashof(sh(list));
1737
    paral = (ap.ashalign < 32)?32:ap.ashalign;
1736
    paral = (ap.ashalign < 32)?32:ap.ashalign;
1738
    if(spar>21){
1737
    if (spar>21) {
1739
      ap.ashalign=64;
1738
      ap.ashalign=64;
1740
      paral = 64;
1739
      paral = 64;
1741
    }
1740
    }
1742
    parsize = ap.ashsize;
1741
    parsize = ap.ashsize;
1743
    /* all parameters passed on stack are quadword aligned */
1742
    /* all parameters passed on stack are quadword aligned */
Line 1748... Line 1747...
1748
    if (disp>448) {spar =22; fpar = 22; }
1747
    if (disp>448) {spar =22; fpar = 22; }
1749
    if (is_floating(hd) && disp+parsize <= 384) {
1748
    if (is_floating(hd) && disp+parsize <= 384) {
1750
      freg frg;
1749
      freg frg;
1751
      ans ansfr;
1750
      ans ansfr;
1752
      frg.fr = fpar++;
1751
      frg.fr = fpar++;
1753
      if(hd != shrealhd)
1752
      if (hd != shrealhd)
1754
	frg.type = IEEE_double;
1753
	frg.type = IEEE_double;
1755
      else
1754
      else
1756
	frg.type = IEEE_single;
1755
	frg.type = IEEE_single;
1757
      setfregalt (ansfr, frg);
1756
      setfregalt(ansfr, frg);
1758
      w.answhere = ansfr;
1757
      w.answhere = ansfr;
1759
      code_here (list, sp, w);
1758
      code_here(list, sp, w);
1760
      /* evaluate parameter into floating parameter register */
1759
      /* evaluate parameter into floating parameter register */
1761
      sp = guardfreg(frg.fr, sp);
1760
      sp = guardfreg(frg.fr, sp);
1762
    }
1761
    }
1763
    else if(((valregable(sh(list)) || (name(sh(list))==cpdhd)) ||
1762
    else if (((valregable(sh(list)) || (name(sh(list)) ==cpdhd)) ||
1764
	     (name(sh(list))==nofhd)) && spar<=21){	
1763
	    (name(sh(list)) ==nofhd)) && spar<=21) {
1765
      /* compound types are always passed in registers
1764
      /* compound types are always passed in registers
1766
	 (given enough space). */
1765
	 (given enough space). */
1767
      ans ansr;
1766
      ans ansr;
1768
      int par_reg;
1767
      int par_reg;
1769
      int numleft = parsize-((LAST_INT_ARG-spar+1)<<6);
1768
      int numleft = parsize- ((LAST_INT_ARG-spar+1) <<6);
1770
      int pregs_used = min((numleft>>6)+6,6);
1769
      int pregs_used = min((numleft>>6) +6,6);
1771
      hadfixed=1;
1770
      hadfixed=1;
1772
      setregalt(ansr,spar);
1771
      setregalt(ansr,spar);
1773
      w.answhere=ansr;
1772
      w.answhere=ansr;
1774
      for(par_reg=spar;par_reg<spar+pregs_used;++par_reg){
1773
      for (par_reg=spar;par_reg<spar+pregs_used;++par_reg) {
1775
	sp = guardreg(par_reg,sp);
1774
	sp = guardreg(par_reg,sp);
1776
      }
1775
      }
1777
      sp = guardreg(spar,sp);
1776
      sp = guardreg(spar,sp);
1778
      code_here(list,sp,w);
1777
      code_here(list,sp,w);
1779
      if(numleft>0){
1778
      if (numleft>0) {
1780
	is.b.offset+=(numleft>>3); /* += number of bytes remaining */
1779
	is.b.offset+=(numleft>>3); /* += number of bytes remaining */
1781
      }
1780
      }
1782
    }
1781
    }
1783
    else {
1782
    else {
1784
      /* pass remaining parameters on the stack.  
1783
      /* pass remaining parameters on the stack.
1785
	 The parameters are aligned on 8 byte boundaries. 
1784
	 The parameters are aligned on 8 byte boundaries.
1786
	 */
1785
	 */
1787
      setinsalt (w.answhere, is);
1786
      setinsalt(w.answhere, is);
1788
      is.b.offset+=(max(ap.ashsize,REG_SIZE)>>3);	
1787
      is.b.offset+= (max(ap.ashsize,REG_SIZE) >>3);
1789
      /* 'size' was used here */
1788
      /* 'size' was used here */
1790
      code_here (list, sp, w);
1789
      code_here(list, sp, w);
1791
      hadfixed = 1;
1790
      hadfixed = 1;
1792
      /* eval parameter into argument space on stack */
1791
      /* eval parameter into argument space on stack */
1793
    }	
1792
    }
1794
    if(name(list) == caller_tag) {
1793
    if (name(list) == caller_tag) {
1795
      no(list) = disp;
1794
      no(list) = disp;
1796
    }
1795
    }
1797
    disp+=parsize;
1796
    disp+=parsize;
1798
    disp = rounder(disp, REG_SIZE);
1797
    disp = rounder(disp, REG_SIZE);
1799
    *sizecallers = min(disp,NUM_PARAM_REGS*REG_SIZE);
1798
    *sizecallers = min(disp,NUM_PARAM_REGS*REG_SIZE);
1800
    if (last (list)) return sp;
1799
    if (last(list)) return sp;
1801
    list = bro (list);
1800
    list = bro(list);
1802
  } /* end for */
1801
  } /* end for */
1803
  return sp;
1802
  return sp;
1804
}
1803
}
1805
 
1804
 
1806
 
1805
 
1807
void load_reg
1806
void load_reg
1808
    PROTO_N ( ( e,r,sp ) )
-
 
1809
    PROTO_T ( exp e X int r X space sp )
1807
(exp e, int r, space sp)
1810
{
1808
{
1811
  where w;
1809
  where w;
1812
  w.ashwhere = ashof(sh(e));
1810
  w.ashwhere = ashof(sh(e));
1813
  setregalt(w.answhere,r);
1811
  setregalt(w.answhere,r);
1814
  code_here(e,sp,w);
1812
  code_here(e,sp,w);
1815
  return;
1813
  return;
1816
}
1814
}
1817
 
1815
 
1818
 
1816
 
1819
 
1817
 
1820
static postlude_chain * old_postludes;
1818
static postlude_chain * old_postludes;
1821
 
1819
 
1822
void update_plc
1820
void update_plc
1823
    PROTO_N ( ( chain,ma ) )
-
 
1824
    PROTO_T ( postlude_chain *chain X int ma )
1821
(postlude_chain *chain, int ma)
1825
{
1822
{
1826
  while(chain) {
1823
  while (chain) {
1827
    exp pl = chain->postlude;
1824
    exp pl = chain->postlude;
1828
    while (name(pl) == ident_tag && name(son(pl)) == caller_name_tag) {
1825
    while (name(pl) == ident_tag && name(son(pl)) == caller_name_tag) {
1829
      no(pl) += (ma<<1);
1826
      no(pl) += (ma<<1);
1830
      pl = bro(son(pl));
1827
      pl = bro(son(pl));
1831
    }
1828
    }
Line 1837... Line 1834...
1837
 
1834
 
1838
/*
1835
/*
1839
  This function finds the caller_tag corresponding to a caller_name tag
1836
  This function finds the caller_tag corresponding to a caller_name tag
1840
*/
1837
*/
1841
exp find_ote
1838
exp find_ote
1842
    PROTO_N ( ( name,n ) )
-
 
1843
    PROTO_T ( exp name X int n )
1839
(exp name, int n)
1844
{
1840
{
1845
  exp dad = father(name);
1841
  exp dad = father(name);
1846
  while(name(dad) != apply_general_tag) {
1842
  while (name(dad)!= apply_general_tag) {
1847
    dad = father(dad);
1843
    dad = father(dad);
1848
  }
1844
  }
1849
  dad = son(bro(son(dad)));
1845
  dad = son(bro(son(dad)));
1850
  while(n) {
1846
  while (n) {
1851
    dad = bro(dad);
1847
    dad = bro(dad);
1852
    n -- ;
1848
    n --;
1853
  }
1849
  }
1854
  Assert(name(dad) == caller_tag);
1850
  Assert(name(dad) == caller_tag);
1855
  return dad;
1851
  return dad;
1856
}
1852
}
1857
 
1853
 
1858
 
1854
 
1859
 
1855
 
1860
/*
1856
/*
1861
  This function produces code for expression e, evaluating 
1857
  This function produces code for expression e, evaluating
1862
  its result into dest.
1858
  its result into dest.
1863
*/
1859
*/
1864
makeans make_code
1860
makeans make_code
1865
    PROTO_N ( ( e,sp,dest,exitlab ) )
-
 
1866
    PROTO_T ( exp e X space sp X where dest X int exitlab )
1861
(exp e, space sp, where dest, int exitlab)
1867
{
1862
{
1868
  INT64  constval;
1863
  INT64  constval;
1869
  makeans mka;
1864
  makeans mka;
1870
  static int param_stack_space;
1865
  static int param_stack_space;
1871
  static int sizecallers = 0;
1866
  static int sizecallers = 0;
1872
tailrecurse: 
1867
tailrecurse:
1873
  mka.lab = exitlab;
1868
  mka.lab = exitlab;
1874
  mka.regmove = NOREG;
1869
  mka.regmove = NOREG;
1875
  clear_INT64(constval);
1870
  clear_INT64(constval);
1876
  
1871
 
1877
  switch (name (e)) {
1872
  switch (name(e)) {
1878
    case ident_tag : {
1873
    case ident_tag: {
1879
      where placew;
1874
      where placew;
1880
      int   r = NOREG;
1875
      int   r = NOREG;
1881
      bool remember = 0;
1876
      bool remember = 0;
1882
      placew = nowhere;
1877
      placew = nowhere;
1883
     
1878
 
1884
      if (name (sh (son (e))) == ptrhd && name (son (e)) != cont_tag) {
1879
      if (name(sh(son(e))) == ptrhd && name(son(e))!= cont_tag) {
1885
	/* We should never be identifing a pointer to bits */
1880
	/* We should never be identifing a pointer to bits */
1886
	if (al1(sh(son(e))) == 1) {
1881
	if (al1(sh(son(e))) == 1) {
1887
#if 0
1882
#if 0
1888
	  failer ("Identify REF BITS");
1883
	  failer("Identify REF BITS");
1889
#endif
1884
#endif
1890
	}	
1885
	}
1891
      }
1886
      }
1892
      if(is_param_reg(no(e)) && is32(sh(son(e))) && 
1887
      if (is_param_reg(no(e)) && is32(sh(son(e))) &&
1893
	 name(son(e))!=formal_callee_tag){
1888
	 name(son(e))!=formal_callee_tag) {
1894
	operate_fmt_immediate(i_addl,no(e),0,no(e));
1889
	operate_fmt_immediate(i_addl,no(e),0,no(e));
1895
      }
1890
      }
1896
      if (props (e) & defer_bit){
1891
      if (props(e) & defer_bit) {
1897
	/* the tag of this declaration is
1892
	/* the tag of this declaration is
1898
	   transparently identified with its
1893
	   transparently identified with its
1899
	   definition, without reserving more
1894
	   definition, without reserving more
1900
	   space */
1895
	   space */
1901
	e = bro (son (e));
1896
	e = bro(son(e));
1902
	goto tailrecurse;
1897
	goto tailrecurse;
1903
      }
1898
      }
1904
      if (son (e) == nilexp) {
1899
      if (son(e) == nilexp) {
1905
	placew = nowhere;	/* is this needed? */
1900
	placew = nowhere;	/* is this needed? */
1906
      }
1901
      }
1907
      else if(name(son(e)) == caller_name_tag){
1902
      else if (name(son(e)) == caller_name_tag) {
1908
	exp ote = find_ote(e,no(son(e)));
1903
	exp ote = find_ote(e,no(son(e)));
1909
	int disp = no(ote);
1904
	int disp = no(ote);
1910
	if(in_vcallers_apply) {
1905
	if (in_vcallers_apply) {
1911
	  /* bit of a hack here */
1906
	  /* bit of a hack here */
1912
	  if(is_floating(name(sh(son(e))))) {
1907
	  if (is_floating(name(sh(son(e))))) {
1913
	    no(e) = (((disp-sizecallers)>>3)<<4) + SP;
1908
	    no(e) = (((disp-sizecallers) >>3) <<4) + SP;
1914
	  }
1909
	  }
1915
	  else {
1910
	  else {
1916
	    no(e) = (((disp - 6*PTR_SZ)>>3)<<4)+SP;
1911
	    no(e) = (((disp - 6*PTR_SZ) >>3) <<4) +SP;
1917
	  }
1912
	  }
1918
	}
1913
	}
1919
	else {
1914
	else {
1920
	  no(e) = (((disp-sizecallers)>>3)<<4) + SP;
1915
	  no(e) = (((disp-sizecallers) >>3) <<4) + SP;
1921
	}
1916
	}
1922
	placew = nowhere;
1917
	placew = nowhere;
1923
      }
1918
      }
1924
      else {
1919
      else {
1925
	ash a;
1920
	ash a;
1926
	int   n = no (e);
1921
	int   n = no(e);
1927
	a = ashof (sh (son (e)));
1922
	a = ashof(sh(son(e)));
1928
	if(is_param_reg(n) && (props(e)&inreg_bits) && proc_has_vararg){
1923
	if (is_param_reg(n) && (props(e) &inreg_bits) && proc_has_vararg) {
1929
	  props(e) &= (~inreg_bits);
1924
	  props(e) &= (~inreg_bits);
1930
	}
1925
	}
1931
	if (((props (e) & inreg_bits) != 0)) {
1926
	if (((props(e) & inreg_bits)!= 0)) {
1932
	  /* tag in some fixed pt reg */
1927
	  /* tag in some fixed pt reg */
1933
	  if (n == NO_REG) {	
1928
	  if (n == NO_REG) {
1934
	    /* if it hasn't been already allocated
1929
	    /* if it hasn't been already allocated
1935
	       into a s-reg (or r0) allocate tag into
1930
	       into a s-reg (or r0) allocate tag into
1936
	       fixed t-reg ... */
1931
	       fixed t-reg ... */
1937
	    int   s = sp.fixed;
1932
	    int   s = sp.fixed;
1938
	    if (props (e) & notparreg)/* ... but not a parameter reg */
1933
	    if (props (e) & notparreg)/* ... but not a parameter reg */
1939
	      s |= PARAM_REGS;
1934
	      s |= PARAM_REGS;
1940
	    n = getreg(s);
1935
	    n = getreg(s);
1941
	    no (e) = n;
1936
	    no(e) = n;
1942
	  }
1937
	  }
1943
	  setregalt (placew.answhere, n);
1938
	  setregalt(placew.answhere, n);
1944
	}
1939
	}
1945
	else if ((props (e) & infreg_bits) != 0) {
1940
	else if ((props(e) & infreg_bits)!= 0) {
1946
	  /* tag in some float reg */
1941
	  /* tag in some float reg */
1947
	  freg frg;
1942
	  freg frg;
1948
	  if (n == NO_REG) {	
1943
	  if (n == NO_REG) {
1949
	    /* if it hasn't been already allocated
1944
	    /* if it hasn't been already allocated
1950
	       into a s-reg (or r0) allocate tag into
1945
	       into a s-reg (or r0) allocate tag into
1951
	       float-reg ... */
1946
	       float-reg ... */
1952
	    int s = sp.flt;
1947
	    int s = sp.flt;
1953
	    if (props (e) & notparreg)
1948
	    if (props(e) & notparreg)
1954
	      s |= 0xc0;
1949
	      s |= 0xc0;
1955
	    n = getfreg (s);
1950
	    n = getfreg(s);
1956
	    no (e) = n;
1951
	    no(e) = n;
1957
	  }
1952
	  }
1958
	  frg.fr = n;
1953
	  frg.fr = n;
1959
	  if(a.ashsize == 64)
1954
	  if (a.ashsize == 64)
1960
	    frg.type = IEEE_double;
1955
	    frg.type = IEEE_double;
1961
	  else
1956
	  else
1962
	    frg.type = IEEE_single;
1957
	    frg.type = IEEE_single;
1963
	  setfregalt (placew.answhere, frg);
1958
	  setfregalt(placew.answhere, frg);
1964
	}
1959
	}
1965
	else if (isparam(e)) {
1960
	else if (isparam(e)) {
1966
	  if(name(son(e)) != formal_callee_tag){
1961
	  if (name(son(e))!= formal_callee_tag) {
1967
	    instore is;
1962
	    instore is;
1968
	    int this_reg=-1;
1963
	    int this_reg=-1;
1969
	    int comp_size;
1964
	    int comp_size;
1970
	    /* floating point registers are to be separated 
1965
	    /* floating point registers are to be separated
1971
	       from fixed point registers when saving to the 
1966
	       from fixed point registers when saving to the
1972
	       stack  */
1967
	       stack  */
1973
	    int n;
1968
	    int n;
1974
	    int offset_adjustment;
1969
	    int offset_adjustment;
1975
	    if(proc_has_vararg && !is_floating(name(sh(son(e))))) {
1970
	    if (proc_has_vararg && !is_floating(name(sh(son(e))))) {
1976
	      offset_adjustment = 6 * PTR_SZ;
1971
	      offset_adjustment = 6 * PTR_SZ;
1977
	    }
1972
	    }
1978
	    else {
1973
	    else {
1979
	      offset_adjustment = arg_stack_space *8;
1974
	      offset_adjustment = arg_stack_space *8;
1980
	    }
1975
	    }
1981
	    
1976
 
1982
	    if(Has_fp){
1977
	    if (Has_fp) {
1983
	      n = (no(son(e))>>3) - (offset_adjustment>>3);
1978
	      n = (no(son(e)) >>3) - (offset_adjustment>>3);
1984
	    }
1979
	    }
1985
	    else{
1980
	    else{
1986
	      n=(((no(son(e))+frame_size+callee_size-offset_adjustment)>>3));
1981
	      n= (((no(son(e)) +frame_size+callee_size-offset_adjustment) >>3));
1987
	    }
1982
	    }
1988
	    
1983
 
1989
	    if(props(son(e))){
1984
	    if (props(son(e))) {
1990
	      this_reg = (props(son(e))-16)<<6;
1985
	      this_reg = (props(son(e)) -16) <<6;
1991
	    }
1986
	    }
1992
	    /* save all parameters in 64 bit chunks */
1987
	    /* save all parameters in 64 bit chunks */
1993
	    /* Byte disp of params */
1988
	    /* Byte disp of params */
1994
	    is.b.offset = n;
1989
	    is.b.offset = n;
1995
	    is.b.base = (Has_fp)?FP:SP;
1990
	    is.b.base = (Has_fp)?FP:SP;
1996
	    is.adval =1;
1991
	    is.adval =1;
1997
	    setinsalt(placew.answhere, is);
1992
	    setinsalt(placew.answhere, is);
1998
	    if(Has_fp){
1993
	    if (Has_fp) {
1999
	      if(Has_no_vcallers || is_floating(name(sh(son(e))))){
1994
	      if (Has_no_vcallers || is_floating(name(sh(son(e))))) {
2000
		no(e) = ((no(son(e))+frame_size+callee_size-locals_offset-
1995
		no(e) = ((no(son(e)) +frame_size+callee_size-locals_offset-
2001
			  (offset_adjustment))<<1)+FP;
1996
			 (offset_adjustment)) <<1) +FP;
2002
	      }
1997
	      }
2003
	      else{
1998
	      else{
2004
		no(e) = ((no(son(e)) + frame_size + callee_size -locals_offset
1999
		no(e) = ((no(son(e)) + frame_size + callee_size -locals_offset
2005
			  - (arg_stack_space<<3))<<1)+FP;
2000
			  - (arg_stack_space<<3)) <<1) +FP;
2006
		no(e) = ((no(son(e)) + frame_size + callee_size -locals_offset
2001
		no(e) = ((no(son(e)) + frame_size + callee_size -locals_offset
2007
			  - (offset_adjustment))<<1)+FP;
2002
			  - (offset_adjustment)) <<1) +FP;
2008
	      }
2003
	      }
2009
	    }
2004
	    }
2010
	    else{
2005
	    else{
2011
	      no(e)=((no(son(e))+frame_size+callee_size-locals_offset - 
2006
	      no(e) = ((no(son(e)) +frame_size+callee_size-locals_offset -
2012
		      (offset_adjustment))<<1)+SP;
2007
		     (offset_adjustment)) <<1) +SP;
2013
	    }
2008
	    }
2014
	       
2009
 
2015
	    if((a.ashsize>64) && (this_reg != -1)){
2010
	    if ((a.ashsize>64) && (this_reg != -1)) {
2016
	      for(comp_size=a.ashsize;(comp_size>0)&&(this_reg<384);
2011
	      for (comp_size=a.ashsize;(comp_size>0) && (this_reg<384);
2017
				      comp_size -= 64){
2012
				      comp_size -= 64) {
2018
		load_store(i_stq,16+ (this_reg>>6),is.b);
2013
		load_store(i_stq,16+ (this_reg>>6),is.b);
2019
		this_reg+=64;
2014
		this_reg+=64;
2020
		is.b.offset+=8;
2015
		is.b.offset+=8;
2021
	      }
2016
	      }
2022
				      /*props(son(e))=0;*/ /* ensures it wont be saved again */
2017
				      /*props(son(e))=0;*/ /* ensures it wont be saved again */
2023
	    }
2018
	    }
2024
	    if(proc_has_vararg && last_param(e) && (this_reg>=0)){
2019
	    if (proc_has_vararg && last_param(e) && (this_reg>=0)) {
2025
	      /* attempt to detect vararg */
2020
	      /* attempt to detect vararg */
2026
	      int r = rounder(no(son(e))+shape_size(sh(son(e))), REG_SIZE);
2021
	      int r = rounder(no(son(e)) +shape_size(sh(son(e))), REG_SIZE);
2027
	      setinsalt(placew.answhere,is);
2022
	      setinsalt(placew.answhere,is);
2028
	      for(r=this_reg;r<=320;r+=64){
2023
	      for (r=this_reg;r<=320;r+=64) {
2029
		/* no need to save first freg */
2024
		/* no need to save first freg */
2030
		is.b.offset = ((r+paramsdumpstart)>>3) - 
2025
		is.b.offset = ((r+paramsdumpstart) >>3) -
2031
		  ((is.b.base == FP)?(frame_size>>3):0);
2026
		 ((is.b.base == FP)?(frame_size>>3):0);
2032
		float_load_store(i_stt,16+(r>>6),is.b);
2027
		float_load_store(i_stt,16+ (r>>6),is.b);
2033
	      }
2028
	      }
2034
	      for(r=this_reg;r<=320;r+=64){
2029
	      for (r=this_reg;r<=320;r+=64) {
2035
		is.b.offset = ((r+gpdumpstart)>>3) - 
2030
		is.b.offset = ((r+gpdumpstart) >>3) -
2036
		  ((is.b.base == FP)?(frame_size>>3):0);;
2031
		 ((is.b.base == FP)?(frame_size>>3):0);;
2037
		load_store(i_stq,16+(r>>6),is.b);
2032
		load_store(i_stq,16+ (r>>6),is.b);
2038
	      }
2033
	      }
2039
	      is.b.offset = n;	
2034
	      is.b.offset = n;
2040
	    }
2035
	    }
2041
	    else{
2036
	    else{
2042
	      if((name(sh(son(e)))==cpdhd)&&(a.ashsize==64)){
2037
	      if ((name(sh(son(e))) ==cpdhd) && (a.ashsize==64)) {
2043
		/* the alignment of a complex shape is the 
2038
		/* the alignment of a complex shape is the
2044
		   maximum of the alignments of its components.  
2039
		   maximum of the alignments of its components.
2045
		   This assignment overrides that rule in order 
2040
		   This assignment overrides that rule in order
2046
		   to simplify saving the parameter to the stack.
2041
		   to simplify saving the parameter to the stack.
2047
		   */
2042
		   */
2048
		a.ashalign=a.ashsize;
2043
		a.ashalign=a.ashsize;
2049
	      }	
2044
	      }
2050
	      is.b.offset = n;	
2045
	      is.b.offset = n;
2051
	    }
2046
	    }
2052
	    setinsalt(placew.answhere, is);
2047
	    setinsalt(placew.answhere, is);
2053
	    remember =1;
2048
	    remember =1;
2054
	  }
2049
	  }
2055
	  else{
2050
	  else{
2056
	    no(e) = ((no(son(e)) + frame_size - locals_offset)<<1)+
2051
	    no(e) = ((no(son(e)) + frame_size - locals_offset) <<1) +
2057
	      ((Has_vcallees)?local_reg:FP);
2052
	     ((Has_vcallees)?local_reg:FP);
2058
	    if(!Has_vcallees){
2053
	    if (!Has_vcallees) {
2059
	      no(e) -= (arg_stack_space<<4);
2054
	      no(e) -= (arg_stack_space<<4);
2060
	    }
2055
	    }
2061
	    placew = nowhere;
2056
	    placew = nowhere;
2062
	  }
2057
	  }
2063
	}
2058
	}
2064
	else {		/* allocate on stack */
2059
	else {		/* allocate on stack */
2065
	  int   base = n & 0x3f;
2060
	  int   base = n & 0x3f;
2066
	  instore is;
2061
	  instore is;
2067
	  is.b.base = base;
2062
	  is.b.base = base;
2068
	  is.b.offset = (n - base) >> 4;
2063
	  is.b.offset = (n - base) >> 4;
2069
	  is.adval = 1;
2064
	  is.adval = 1;
2070
	  if(base == SP){
2065
	  if (base == SP) {
2071
	    is.b.offset += locals_offset >> 3;
2066
	    is.b.offset += locals_offset >> 3;
2072
	  }
2067
	  }
2073
	  else if((base == FP && Has_fp)){
2068
	  else if ((base == FP && Has_fp)) {
2074
#if 1
2069
#if 1
2075
	    is.b.offset += (((locals_offset-callee_size-frame_size)>>3)
2070
	    is.b.offset += (((locals_offset-callee_size-frame_size) >>3)
2076
			    /*- ((in_general_proc)?0:arg_stack_space)*/);
2071
			    /*- ((in_general_proc)?0:arg_stack_space)*/);
2077
#else
2072
#else
2078
	    is.b.offset += (((locals_offset-callee_size-frame_size)>>3)
2073
	    is.b.offset += (((locals_offset-callee_size-frame_size) >>3)
2079
			    -arg_stack_space);
2074
			    -arg_stack_space);
2080
#endif
2075
#endif
2081
	  }
2076
	  }
2082
	  else if((base == local_reg && Has_vcallees)){
2077
	  else if ((base == local_reg && Has_vcallees)) {
2083
	    is.b.offset += ((locals_offset-frame_size)>>3);
2078
	    is.b.offset += ((locals_offset-frame_size) >>3);
2084
	  }
2079
	  }
2085
	  setinsalt(placew.answhere,is);
2080
	  setinsalt(placew.answhere,is);
2086
	  remember = 1;
2081
	  remember = 1;
2087
	}
2082
	}
2088
       
2083
 
2089
	placew.ashwhere = a;
2084
	placew.ashwhere = a;
2090
      }
2085
      }
2091
      if (isparam(e) && name(son(e)) != formal_callee_tag) {
2086
      if (isparam(e) && name(son(e))!= formal_callee_tag) {
2092
	exp se = son(e);
2087
	exp se = son(e);
2093
	exp d = e;
2088
	exp d = e;
2094
	/* parameter fiddles */
2089
	/* parameter fiddles */
2095
	if (props(se) == 0 && (props(d) & inanyreg) !=0) {
2090
	if (props(se) == 0 && (props(d) & inanyreg)!=0) {
2096
	  /* not originally in required reg */
2091
	  /* not originally in required reg */
2097
	  ans a;
2092
	  ans a;
2098
	  instore is;
2093
	  instore is;
2099
	  is.b.base = (Has_fp)?FP:SP;
2094
	  is.b.base = (Has_fp)?FP:SP;
2100
	  is.b.offset = ((no(se)-(arg_stack_space<<3)) + 
2095
	  is.b.offset = ((no(se) - (arg_stack_space<<3)) +
2101
	    ((Has_fp)?0:((callee_size+frame_size))))>>3;
2096
	   ((Has_fp)?0:((callee_size+frame_size)))) >>3;
2102
	  
2097
 
2103
			  
2098
 
2104
	  is.adval = 0;
2099
	  is.adval = 0;
2105
	  setinsalt(a, is);
2100
	  setinsalt(a, is);
2106
	  (void)move(a,placew, sp, name(sh(se)) & 1);
2101
	 (void)move(a,placew, sp, name(sh(se)) & 1);
2107
	}
2102
	}
2108
	else if (props(se) !=0 && (props(d) & inanyreg) ==0) {
2103
	else if (props(se)!=0 && (props(d) & inanyreg) ==0) {
2109
	  /* originally in reg and required in store */
2104
	  /* originally in reg and required in store */
2110
	  ans a;
2105
	  ans a;
2111
	  if (is_floating(name(sh(se))) ) {
2106
	  if (is_floating(name(sh(se)))) {
2112
	    freg fr;
2107
	    freg fr;
2113
	    fr.fr = props(se);
2108
	    fr.fr = props(se);
2114
	    if(name(sh(se))!=shrealhd)
2109
	    if (name(sh(se))!=shrealhd)
2115
	      fr.type = IEEE_double;
2110
	      fr.type = IEEE_double;
2116
	    else
2111
	    else
2117
	      fr.type = IEEE_single;
2112
	      fr.type = IEEE_single;
2118
	    setfregalt(a, fr);
2113
	    setfregalt(a, fr);
2119
	  }	
2114
	  }
2120
	  else { setregalt(a, props(se)); }
2115
	  else { setregalt(a, props(se)); }
2121
	  r = move(a, placew, sp, 0);
2116
	  r = move(a, placew, sp, 0);
2122
	}
2117
	}
2123
	else if (props(se) !=0 && props(se) != no(d) ) {
2118
	else if (props(se)!=0 && props(se)!= no(d)) {
2124
	  /* in wrong register */
2119
	  /* in wrong register */
2125
	  int sr = no(d);
2120
	  int sr = no(d);
2126
	  int tr = props(se);
2121
	  int tr = props(se);
2127
	  if (is_floating(name(sh(se))) ) {
2122
	  if (is_floating(name(sh(se)))) {
2128
	    if ((fltdone & (1<<(sr))) != 0) {
2123
	    if ((fltdone & (1<< (sr)))!= 0) {
2129
	      float_op( (name(sh(se)) != shrealhd) ? i_cpys: i_cpys,
2124
	      float_op((name(sh(se))!= shrealhd)? i_cpys: i_cpys,
2130
			(int)props(se),(int)(props(se)),no(d));
2125
			(int)props(se), (int)(props(se)),no(d));
2131
	    }		
2126
	    }
2132
	    else { 
2127
	    else {
2133
	      props(se) = sr; no(d)= tr;
2128
	      props(se) = sr; no(d) = tr;
2134
	      sp = guardfreg(tr, sp); 
2129
	      sp = guardfreg(tr, sp);
2135
	      /* !? swopped and moved in  dump_tag !? */
2130
	      /* !? swopped and moved in  dump_tag !? */
2136
	    }
2131
	    }
2137
	  }
2132
	  }
2138
	  else {
2133
	  else {
2139
	    if ( (fixdone & (1<<sr)) !=0 ) {
2134
	    if ((fixdone & (1<<sr))!=0) {
2140
	      /*	      operate_fmt(i_bis,no(d),no(d),(int)props(se));*/
2135
	      /*	      operate_fmt(i_bis,no(d),no(d),(int)props(se));*/
2141
	      operate_fmt(i_bis,(int)props(se),(int)props(se),no(d));
2136
	      operate_fmt(i_bis,(int)props(se), (int)props(se),no(d));
2142
	    }
2137
	    }
2143
	    else {
2138
	    else {
2144
	      props(se) = sr; no(d)= tr;
2139
	      props(se) = sr; no(d) = tr;
2145
	      sp = guardreg(tr,sp);
2140
	      sp = guardreg(tr,sp);
2146
	      /* !? swapped for dump_tag !? */
2141
	      /* !? swapped for dump_tag !? */
2147
	    }
2142
	    }
2148
	  }
2143
	  }
2149
	}	
2144
	}
2150
	/* maybe more about promotions */          
2145
	/* maybe more about promotions */
2151
      }
2146
      }
2152
      else if(isparam(e) && name(son(e)) == formal_callee_tag){
2147
      else if (isparam(e) && name(son(e)) == formal_callee_tag) {
2153
	exp se = son(e);
2148
	exp se = son(e);
2154
	exp d = e;
2149
	exp d = e;
2155
	if ((props(d) & inanyreg) != 0) {
2150
	if ((props(d) & inanyreg)!= 0) {
2156
	  /* callee parameter assigned to reg */
2151
	  /* callee parameter assigned to reg */
2157
	  ans a;
2152
	  ans a;
2158
	  instore is;
2153
	  instore is;
2159
	  is.b.base = FP;
2154
	  is.b.base = FP;
2160
	  is.b.offset = (no(se) - callee_size)>>3;
2155
	  is.b.offset = (no(se) - callee_size) >>3;
2161
	  is.adval = 0;
2156
	  is.adval = 0;
2162
	  setinsalt(a, is);
2157
	  setinsalt(a, is);
2163
	  (void)move(a, placew, sp, is_signed(sh(se)));
2158
	 (void)move(a, placew, sp, is_signed(sh(se)));
2164
	}	 
2159
	}
2165
      }
2160
      }
2166
      else{
2161
      else{
2167
	r = code_here (son (e), sp, placew);
2162
	r = code_here(son(e), sp, placew);
2168
	/* evaluate the initialisation of tag, putting it into place
2163
	/* evaluate the initialisation of tag, putting it into place
2169
	   allocated ... */
2164
	   allocated ... */
2170
      }
2165
      }
2171
      if (remember && r != NOREG && pt (e) != nilexp
2166
      if (remember && r != NOREG && pt(e)!= nilexp
2172
	  && eq_sze (sh (son (e)), sh (pt (e)))) {
2167
	  && eq_sze(sh(son(e)), sh(pt(e)))) {
2173
	/* ...if it was temporarily in a register, remember it */
2168
	/* ...if it was temporarily in a register, remember it */
2174
	if (isvar (e)) {
2169
	if (isvar(e)) {
2175
	  keepcont (pt (e), r);
2170
	  keepcont(pt(e), r);
2176
	}	
2171
	}
2177
	else {
2172
	else {
2178
	  keepreg (pt (e), r);
2173
	  keepreg(pt(e), r);
2179
	}
2174
	}
2180
      }
2175
      }
2181
      sp =  guard (placew, sp);
2176
      sp =  guard(placew, sp);
2182
      e = bro (son (e));
2177
      e = bro(son(e));
2183
      goto tailrecurse;		        	
2178
      goto tailrecurse;
2184
      /* and evaluate the body of the declaration */
2179
      /* and evaluate the body of the declaration */
2185
    }					/* end ident */
2180
    }					/* end ident */
2186
    case clear_tag : {
2181
    case clear_tag: {
2187
      return mka;
2182
      return mka;
2188
    }	
2183
    }
2189
    case seq_tag : {
2184
    case seq_tag: {
2190
      exp t = son (son (e));
2185
      exp t = son(son(e));
2191
      for (;;) {
2186
      for (;;) {
2192
	exp next = (last (t)) ? (bro (son (e))) : bro (t);
2187
	exp next = (last(t))?(bro(son(e))): bro(t);
2193
	if (name (next) == goto_tag) {/* gotos end sequences */
2188
	if (name (next) == goto_tag) {/* gotos end sequences */
2194
	  make_code (t, sp, nowhere, no (son (pt (next))));
2189
	  make_code(t, sp, nowhere, no(son(pt(next))));
2195
	}	
2190
	}
2196
	else {
2191
	else {
2197
	  code_here (t, sp, nowhere);
2192
	  code_here(t, sp, nowhere);
2198
	}
2193
	}
2199
	if (last (t)) {
2194
	if (last(t)) {
2200
	  e = bro (son (e));
2195
	  e = bro(son(e));
2201
	  goto tailrecurse;
2196
	  goto tailrecurse;
2202
	}
2197
	}
2203
	t = bro (t);
2198
	t = bro(t);
2204
      }
2199
      }
2205
    }				/* end seq */
2200
    }				/* end seq */
2206
    case cond_tag : {
2201
    case cond_tag: {
2207
      exp first = son (e);
2202
      exp first = son(e);
2208
      exp second = bro (son (e));
2203
      exp second = bro(son(e));
2209
      exp test;
2204
      exp test;
2210
      exp record;
2205
      exp record;
2211
      record = getexp(f_bottom,nilexp,0,nilexp,nilexp,0,0,0);
2206
      record = getexp(f_bottom,nilexp,0,nilexp,nilexp,0,0,0);
2212
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2207
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2213
      start_new_capsule(true);
2208
      start_new_capsule(true);
2214
#endif     
2209
#endif
2215
      if (dest.answhere.discrim == insomereg) {
2210
      if (dest.answhere.discrim == insomereg) {
2216
	/* must make choice of register to contain answer to cond */
2211
	/* must make choice of register to contain answer to cond */
2217
	int  *sr = someregalt (dest.answhere);
2212
	int  *sr = someregalt(dest.answhere);
2218
	if (*sr != -1) {
2213
	if (*sr != -1) {
2219
	  failer ("Somereg *2");
2214
	  failer("Somereg *2");
2220
	}	
2215
	}
2221
	*sr = getreg (sp.fixed);
2216
	*sr = getreg(sp.fixed);
2222
	setregalt (dest.answhere, *sr);
2217
	setregalt(dest.answhere, *sr);
2223
      }
2218
      }
2224
      else if (dest.answhere.discrim == insomefreg) {
2219
      else if (dest.answhere.discrim == insomefreg) {
2225
	somefreg sfr;
2220
	somefreg sfr;
2226
	freg fr;
2221
	freg fr;
2227
	sfr = somefregalt(dest.answhere);
2222
	sfr = somefregalt(dest.answhere);
2228
	if (*sfr.fr != -1) { failer ("Somefreg *2"); }
2223
	if (*sfr.fr != -1) { failer("Somefreg *2"); }
2229
	*sfr.fr = getfreg(sp.flt);
2224
	*sfr.fr = getfreg(sp.flt);
2230
	fr.fr = *sfr.fr;
2225
	fr.fr = *sfr.fr;
2231
	fr.type = sfr.type;
2226
	fr.type = sfr.type;
2232
	setfregalt(dest.answhere, fr);
2227
	setfregalt(dest.answhere, fr);
2233
      }
2228
      }
2234
 
2229
 
2235
      if (name (first) == goto_tag && pt (first) == second) {
2230
      if (name(first) == goto_tag && pt(first) == second) {
2236
	/* first is goto second */
2231
	/* first is goto second */
2237
	no (son (second)) = 0;
2232
	no(son(second)) = 0;
2238
	mka = make_code (second, sp, dest, exitlab);
2233
	mka = make_code(second, sp, dest, exitlab);
2239
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2234
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2240
	close_capsule();
2235
	close_capsule();
2241
#endif       
2236
#endif
2242
	return mka;
2237
	return mka;
2243
      }	
2238
      }
2244
      else if (name (second) == labst_tag && 
2239
      else if (name(second) == labst_tag &&
2245
	       name (bro (son (second))) == top_tag) {
2240
	       name(bro(son(second))) == top_tag) {
2246
	/* second is empty */
2241
	/* second is empty */
2247
	int   endl = (exitlab == 0) ? new_label () : exitlab;
2242
	int   endl = (exitlab == 0)? new_label(): exitlab;
2248
	no (son (second)) = endl;
2243
	no(son(second)) = endl;
2249
	make_code (first, sp, dest, endl);
2244
	make_code(first, sp, dest, endl);
2250
	mka.lab = endl;
2245
	mka.lab = endl;
2251
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2246
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2252
	close_capsule();
2247
	close_capsule();
2253
#endif
2248
#endif
2254
	return mka;
2249
	return mka;
2255
      }
2250
      }
2256
      else if (name (second) == labst_tag &&
2251
      else if (name(second) == labst_tag &&
2257
	       name (bro (son (second))) == goto_tag) {
2252
	       name(bro(son(second))) == goto_tag) {
2258
	/* second is goto */
2253
	/* second is goto */
2259
	exp g = bro (son (second));
2254
	exp g = bro(son(second));
2260
	no (son (second)) = no (son (pt (g)));
2255
	no(son(second)) = no(son(pt(g)));
2261
	mka = make_code (first, sp, dest, exitlab);
2256
	mka = make_code(first, sp, dest, exitlab);
2262
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2257
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2263
	close_capsule();
2258
	close_capsule();
2264
#endif	     
2259
#endif
2265
	return mka;
2260
	return mka;
2266
      }
2261
      }
2267
      if ((test = testlast (first, second)) /* I mean it */ ) {
2262
      if ((test = testlast (first, second)) /* I mean it */ ) {
2268
	/* effectively an empty then part */
2263
	/* effectively an empty then part */
2269
	int   l = (exitlab != 0) ? exitlab : new_label ();
2264
	int   l = (exitlab != 0)? exitlab : new_label();
2270
	bool rev = IsRev(test);
2265
	bool rev = IsRev(test);
2271
	ptno(test) = -l;	/* make test jump to exitlab - see
2266
	ptno(test) = -l;	/* make test jump to exitlab - see
2272
				   test_tag: */
2267
				   test_tag: */
2273
	props (test) = notbranch[(props (test)&127) - 1];
2268
	props(test) = notbranch[(props(test) &127) - 1];
2274
	if (rev) { SetRev(test); }
2269
	if (rev) { SetRev(test); }
2275
	/* ... with inverse test */
2270
	/* ... with inverse test */
2276
	no (son (second)) = new_label ();
2271
	no(son(second)) = new_label();
2277
	make_code (first, sp, dest, l);
2272
	make_code(first, sp, dest, l);
2278
	make_code (second, sp, dest, l);
2273
	make_code(second, sp, dest, l);
2279
	mka.lab = l;
2274
	mka.lab = l;
2280
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2275
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2281
	close_capsule();
2276
	close_capsule();
2282
#endif	 
2277
#endif
2283
	return mka;
2278
	return mka;
2284
      }
2279
      }
2285
      else {
2280
      else {
2286
	int   fl;
2281
	int   fl;
2287
	no (son (second)) = new_label ();
2282
	no(son(second)) = new_label();
2288
	fl = make_code (first, sp, dest, exitlab).lab;
2283
	fl = make_code(first, sp, dest, exitlab).lab;
2289
	{
2284
	{
2290
	  int l = (fl != 0) ? fl : ((exitlab != 0) ? exitlab : new_label ());
2285
	  int l = (fl != 0)? fl :((exitlab != 0)? exitlab : new_label());
2291
	  if(name(sh(first))!=bothd) integer_branch(i_br,31,l);
2286
	  if (name(sh(first))!=bothd)integer_branch(i_br,31,l);
2292
	  make_code (second, sp, dest, l);
2287
	  make_code(second, sp, dest, l);
2293
	  clear_all ();
2288
	  clear_all();
2294
	  mka.lab = l;
2289
	  mka.lab = l;
2295
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2290
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2296
	  close_capsule();
2291
	  close_capsule();
2297
#endif		   
2292
#endif
2298
	  return mka;
2293
	  return mka;
2299
	}
2294
	}
2300
      }
2295
      }
2301
    }				/* end cond */
2296
    }				/* end cond */
2302
    case labst_tag : {
2297
    case labst_tag: {
2303
      if (no (son (e)) != 0) {
2298
      if (no(son(e))!= 0) {
2304
	set_label (no (son (e)));
2299
	set_label(no(son(e)));
2305
      }
2300
      }
2306
      if (is_loaded_lv(e) && No_S) { 
2301
      if (is_loaded_lv(e) && No_S) {
2307
	/* can be target of long_jump; reset sp */
2302
	/* can be target of long_jump; reset sp */
2308
	baseoff b;
2303
	baseoff b;
2309
	b.base = FP;
2304
	b.base = FP;
2310
	if(Has_vcallees){
2305
	if (Has_vcallees) {
2311
#if 0
2306
#if 0
2312
	  b.offset = -arg_stack_space-(3* (PTR_SZ>>3));
2307
	  b.offset = -arg_stack_space- (3*(PTR_SZ>>3));
2313
#endif
2308
#endif
2314
	  b.offset = -(3*(PTR_SZ>>3));
2309
	  b.offset = - (3*(PTR_SZ>>3));
2315
	  load_store(i_ldq,local_reg,b);
2310
	  load_store(i_ldq,local_reg,b);
2316
	}
2311
	}
2317
	if (Has_tos) {
2312
	if (Has_tos) {
2318
	  b.offset = -(PTR_SZ>>3)-(arg_stack_space);
2313
	  b.offset = - (PTR_SZ>>3) - (arg_stack_space);
2319
	  load_store(i_ldq,SP,b);
2314
	  load_store(i_ldq,SP,b);
2320
	}
2315
	}
2321
	else {
2316
	else {
2322
	  comment("labst_tag:");
2317
	  comment("labst_tag:");
2323
	  operate_fmt_immediate(i_subq,FP,(frame_size+callee_size)>>3,SP);
2318
	  operate_fmt_immediate(i_subq,FP,(frame_size+callee_size) >>3,SP);
2324
	}
2319
	}
2325
      }			
2320
      }
2326
      e = bro (son (e));
2321
      e = bro(son(e));
2327
      goto tailrecurse;
2322
      goto tailrecurse;
2328
    }				/* end labst */
2323
    }				/* end labst */
2329
    case rep_tag : {
2324
    case rep_tag: {
2330
      exp first = son (e);
2325
      exp first = son(e);
2331
      exp second = bro (first);
2326
      exp second = bro(first);
2332
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2327
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2333
      /* start_new_capsule(true);*/
2328
      /* start_new_capsule(true);*/
2334
#endif       
2329
#endif
2335
      code_here(first,sp,nowhere);
2330
      code_here(first,sp,nowhere);
2336
      no (son (second)) = new_label ();
2331
      no(son(second)) = new_label();
2337
      /*e = second;*/
2332
      /*e = second;*/
2338
      mka = make_code(second,sp,dest,exitlab);
2333
      mka = make_code(second,sp,dest,exitlab);
2339
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2334
#if DO_SCHEDULE && ENCAPSULATE_LABELS
2340
/*       close_capsule();*/
2335
/*       close_capsule();*/
2341
#endif
2336
#endif
2342
      return mka;
2337
      return mka;
2343
      /*goto tailrecurse;*/
2338
      /*goto tailrecurse;*/
2344
    }				/* end rep */
2339
    }				/* end rep */
2345
    case goto_tag : {
2340
    case goto_tag: {
2346
      int   lab = no (son (pt (e)));
2341
      int   lab = no(son(pt(e)));
2347
      clear_all ();
2342
      clear_all();
2348
      integer_branch(i_br,31,lab);
2343
      integer_branch(i_br,31,lab);
2349
      return mka;
2344
      return mka;
2350
    }				/* end goto */
2345
    }				/* end goto */
2351
    case make_lv_tag : {
2346
    case make_lv_tag: {
2352
      int r = regfrmdest(&dest,sp);
2347
      int r = regfrmdest(&dest,sp);
2353
      ans aa;
2348
      ans aa;
2354
      load_store_label(i_lda,r,no(son(pt(e))));
2349
      load_store_label(i_lda,r,no(son(pt(e))));
2355
      setregalt(aa,r);
2350
      setregalt(aa,r);
2356
      move(aa,dest, guardreg(r,sp), 0);
2351
      move(aa,dest, guardreg(r,sp), 0);
2357
      mka.regmove = r;
2352
      mka.regmove = r;
2358
      return mka;
2353
      return mka;
2359
    }
2354
    }
2360
    
2355
 
2361
    case long_jump_tag : {
2356
    case long_jump_tag: {
2362
      int fp = reg_operand(son(e), sp);
2357
      int fp = reg_operand(son(e), sp);
2363
      int labval = reg_operand(bro(son(e)), sp);
2358
      int labval = reg_operand(bro(son(e)), sp);
2364
      comment("long jump");
2359
      comment("long jump");
2365
      operate_fmt(i_bis,fp,fp,FP);	/* move fp into FP */
2360
      operate_fmt(i_bis,fp,fp,FP);	/* move fp into FP */
2366
      /* load labval into register*/
2361
      /* load labval into register*/
Line 2368... Line 2363...
2368
      return mka;
2363
      return mka;
2369
    }
2364
    }
2370
    /*
2365
    /*
2371
      max(x,y) and min(x,y)
2366
      max(x,y) and min(x,y)
2372
      */
2367
      */
2373
    case offset_max_tag :
2368
    case offset_max_tag:
2374
    case max_tag :
2369
    case max_tag:
2375
    case min_tag :{
2370
    case min_tag:{
2376
      exp l = son(e);
2371
      exp l = son(e);
2377
      exp r = bro(l);
2372
      exp r = bro(l);
2378
      int a1= reg_operand(l,sp);
2373
      int a1= reg_operand(l,sp);
2379
      int a2 = reg_operand(r,sp);
2374
      int a2 = reg_operand(r,sp);
2380
      int d = regfrmdest(&dest,sp);
2375
      int d = regfrmdest(&dest,sp);
2381
      int rtmp = getreg(guardreg(d,sp).fixed);
2376
      int rtmp = getreg(guardreg(d,sp).fixed);
2382
      ans aa;
2377
      ans aa;
2383
 
2378
 
2384
      operate_fmt(i_bis,a1,a1,d);
2379
      operate_fmt(i_bis,a1,a1,d);
2385
      operate_fmt(is_signed(sh(l))?i_cmplt:i_cmpult,a1,a2,rtmp);
2380
      operate_fmt(is_signed(sh(l))?i_cmplt:i_cmpult,a1,a2,rtmp);
2386
      if((name(e) == max_tag) || (name(e) == offset_max_tag)){
2381
      if ((name(e) == max_tag) || (name(e) == offset_max_tag)) {
2387
	operate_fmt(i_cmovne,rtmp,a2,d);
2382
	operate_fmt(i_cmovne,rtmp,a2,d);
2388
      }
2383
      }
2389
      else{
2384
      else{
2390
	operate_fmt(i_cmoveq,rtmp,a2,d);
2385
	operate_fmt(i_cmoveq,rtmp,a2,d);
2391
      }
2386
      }
2392
      setregalt(aa,d);
2387
      setregalt(aa,d);
2393
      (void)move(aa,dest,guardreg(d,sp),0);
2388
     (void)move(aa,dest,guardreg(d,sp),0);
2394
      mka.regmove=d;
2389
      mka.regmove=d;
2395
      return mka;
2390
      return mka;
2396
    }
2391
    }
2397
 
2392
 
2398
    case fmax_tag : {
2393
    case fmax_tag: {
2399
      exp l = son(e);
2394
      exp l = son(e);
2400
      exp r = bro(l);
2395
      exp r = bro(l);
2401
      int a1 = freg_operand(l,sp);
2396
      int a1 = freg_operand(l,sp);
2402
      int a2 = freg_operand(r,sp);
2397
      int a2 = freg_operand(r,sp);
2403
      freg rd;
2398
      freg rd;
Line 2410... Line 2405...
2410
      float_op(i_fcmovne,rtmp,a2,rd.fr);
2405
      float_op(i_fcmovne,rtmp,a2,rd.fr);
2411
      setfregalt(aa,rd);
2406
      setfregalt(aa,rd);
2412
      mka.regmove = move(aa,dest,guardfreg(rd.fr,sp),1);
2407
      mka.regmove = move(aa,dest,guardfreg(rd.fr,sp),1);
2413
      return mka;
2408
      return mka;
2414
    }
2409
    }
2415
    
2410
 
2416
    case abslike_tag :{
2411
    case abslike_tag:{
2417
      /* if (test x) then res = -x, else res = x *
2412
      /* if (test x) then res = -x, else res = x *
2418
	 The code produced for this construct is:
2413
	 The code produced for this construct is:
2419
	 move x to res, neg x -> y, cmov(test) x,y,res.
2414
	 move x to res, neg x -> y, cmov(test) x,y,res.
2420
	 If the test is unsigned then we can optimise certain 
2415
	 If the test is unsigned then we can optimise certain
2421
	 cases, i.e. less-than and greater-than-or-equal are
2416
	 cases, i.e. less-than and greater-than-or-equal are
2422
	 always false and true respectively
2417
	 always false and true respectively
2423
	 */
2418
	 */
2424
      exp l = son(son(e));
2419
      exp l = son(son(e));
2425
      shape shl = sh(l);
2420
      shape shl = sh(l);
Line 2445... Line 2440...
2445
      operate_fmt(i_subq,31,a1,rtmp);
2440
      operate_fmt(i_subq,31,a1,rtmp);
2446
      operate_fmt(cmove_ins,a1,rtmp,dest_reg);
2441
      operate_fmt(cmove_ins,a1,rtmp,dest_reg);
2447
      move(aa,dest,guardreg(dest_reg,nsp),0);
2442
      move(aa,dest,guardreg(dest_reg,nsp),0);
2448
      return mka;
2443
      return mka;
2449
    }
2444
    }
2450
       
-
 
2451
       
-
 
2452
 
2445
 
-
 
2446
 
-
 
2447
 
2453
    case absbool_tag : 
2448
    case absbool_tag:
2454
    /*case abslike_tag:*/{
2449
    /*case abslike_tag:*/{
2455
      /*
2450
      /*
2456
	need to clear up the distinctions between comparison and
2451
	need to clear up the distinctions between comparison and
2457
	conditional move.
2452
	conditional move.
2458
	*/
2453
	*/
2459
      exp l = son (son (e));
2454
      exp l = son(son(e));
2460
      exp r = bro (l);
2455
      exp r = bro(l);
2461
      shape shl = sh (l);
2456
      shape shl = sh(l);
2462
      instruction compare_ins;
2457
      instruction compare_ins;
2463
      int   n = props (son (e));
2458
      int   n = props(son(e));
2464
      int   d;
2459
      int   d;
2465
      int   a1;
2460
      int   a1;
2466
      int   a2;
2461
      int   a2;
2467
      bool xlike = (name(e) != absbool_tag);
2462
      bool xlike = (name(e)!= absbool_tag);
2468
      ans aa;
2463
      ans aa;
2469
      bool uns = (!is_signed(shl));
2464
      bool uns = (!is_signed(shl));
2470
      if (!xlike && name (l) == val_tag) {
2465
      if (!xlike && name(l) == val_tag) {
2471
	/* put literal operand on right */
2466
	/* put literal operand on right */
2472
	exp temp = l;
2467
	exp temp = l;
2473
	l = r;
2468
	l = r;
2474
	r = temp;
2469
	r = temp;
2475
	if (n <= 2) {
2470
	if (n <= 2) {
Line 2478... Line 2473...
2478
	else
2473
	else
2479
	  if (n <= 4) {
2474
	  if (n <= 4) {
2480
	    n -= 2;
2475
	    n -= 2;
2481
	  }
2476
	  }
2482
      }
2477
      }
2483
	
2478
 
2484
      (void)compares(&compare_ins,shl,n);
2479
     (void)compares(&compare_ins,shl,n);
2485
      d = regfrmdest(&dest, sp);
2480
      d = regfrmdest(&dest, sp);
2486
 
2481
 
2487
      /* reg d will contain result of compare */
2482
      /* reg d will contain result of compare */
2488
 
2483
 
2489
      a1 = reg_operand (l, sp);
2484
      a1 = reg_operand(l, sp);
2490
      sp = guardreg(a1,sp);
2485
      sp = guardreg(a1,sp);
2491
      if (xlike && a1==d) {
2486
      if (xlike && a1==d) {
2492
	d = getreg(sp.fixed);
2487
	d = getreg(sp.fixed);
2493
      }
2488
      }
2494
      if (name (r) == val_tag) {
2489
      if (name(r) == val_tag) {
2495
	if((n==1)||(n==2)){
2490
	if ((n==1) || (n==2)) {
2496
	  int rt = getreg(guardreg(d,sp).fixed);
2491
	  int rt = getreg(guardreg(d,sp).fixed);
2497
	  if(no(r)){
2492
	  if (no(r)) {
2498
	    INT64 res;
2493
	    INT64 res;
2499
	    if(isbigval(r)){
2494
	    if (isbigval(r)) {
2500
	      INT64_assign(res,flt64_to_INT64(exp_to_f64(r)));
2495
	      INT64_assign(res,flt64_to_INT64(exp_to_f64(r)));
2501
	      /*res=flt64_to_INT64(exp_to_f64(r));*/
2496
	      /*res=flt64_to_INT64(exp_to_f64(r));*/
2502
	    }
2497
	    }
2503
	    else{
2498
	    else{
2504
	      INT64_assign(res,make_INT64(0,no(r)));
2499
	      INT64_assign(res,make_INT64(0,no(r)));
2505
	    }	
2500
	    }
2506
	    load_store_immediate(i_ldiq,rt,res);
2501
	    load_store_immediate(i_ldiq,rt,res);
2507
	  }
2502
	  }
2508
	  else
2503
	  else
2509
	    rt=31;
2504
	    rt=31;
2510
	  if(name(e)!=absbool_tag){
2505
	  if (name(e)!=absbool_tag) {
2511
	    int rtmp;
2506
	    int rtmp;
2512
	    if(uns){
2507
	    if (uns) {
2513
	      rtmp = getreg(sp.fixed);
2508
	      rtmp = getreg(sp.fixed);
2514
	      operate_fmt(compare_ins,rt,a1,rtmp);
2509
	      operate_fmt(compare_ins,rt,a1,rtmp);
2515
	    }
2510
	    }
2516
	    else{
2511
	    else{
2517
	      rtmp = rt;
2512
	      rtmp = rt;
Line 2522... Line 2517...
2522
	  }
2517
	  }
2523
	  else
2518
	  else
2524
	    operate_fmt(compare_ins,rt,a1,d);
2519
	    operate_fmt(compare_ins,rt,a1,d);
2525
	}
2520
	}
2526
	else{
2521
	else{
2527
	  if(isbigval(r)){
2522
	  if (isbigval(r)) {
2528
	    operate_fmt_big_immediate(compare_ins,a1,
2523
	    operate_fmt_big_immediate(compare_ins,a1,
2529
				      flt64_to_INT64(exp_to_f64(r)),d);
2524
				      flt64_to_INT64(exp_to_f64(r)),d);
2530
	  }
2525
	  }
2531
	  else{
2526
	  else{
2532
	    operate_fmt_immediate(compare_ins,a1,no(r),d);
2527
	    operate_fmt_immediate(compare_ins,a1,no(r),d);
Line 2536... Line 2531...
2536
	  operate_fmt(i_cmpeq,d,31,d);
2531
	  operate_fmt(i_cmpeq,d,31,d);
2537
	/* invert the result */
2532
	/* invert the result */
2538
      }
2533
      }
2539
      else {
2534
      else {
2540
	space nsp;
2535
	space nsp;
2541
	nsp = guardreg (a1, sp);
2536
	nsp = guardreg(a1, sp);
2542
	a2 = reg_operand (r, nsp);
2537
	a2 = reg_operand(r, nsp);
2543
	if (xlike && a2==d) {
2538
	if (xlike && a2==d) {
2544
	  nsp = guardreg(a2, nsp);
2539
	  nsp = guardreg(a2, nsp);
2545
	  d = getreg(nsp.fixed);
2540
	  d = getreg(nsp.fixed);
2546
	}
2541
	}
2547
	if((n==1)||(n==2))
2542
	if ((n==1) || (n==2))
2548
	  operate_fmt(compare_ins,a2,a1,d);
2543
	  operate_fmt(compare_ins,a2,a1,d);
2549
	else
2544
	else
2550
	  operate_fmt(compare_ins,a1,a2,d);
2545
	  operate_fmt(compare_ins,a1,a2,d);
2551
	if(n==6) operate_fmt(i_cmpeq,d,31,d);
2546
	if (n==6)operate_fmt(i_cmpeq,d,31,d);
2552
      }
2547
      }
2553
      if (name(e)==maxlike_tag || name(e)==minlike_tag) {
2548
      if (name(e) ==maxlike_tag || name(e) ==minlike_tag) {
2554
	instruction ins;
2549
	instruction ins;
2555
	int l = new_label();
2550
	int l = new_label();
2556
	setnoreorder();
2551
	setnoreorder();
2557
	ins=(name(e)==maxlike_tag)?i_bne:i_beq;
2552
	ins= (name(e) ==maxlike_tag)?i_bne:i_beq;
2558
	/*operate_fmt(i_addu, d, a1, 0);*/
2553
	/*operate_fmt(i_addu, d, a1, 0);*/
2559
	integer_branch(ins,d,l);
2554
	integer_branch(ins,d,l);
2560
	if (name(r)==val_tag) { 
2555
	if (name(r) ==val_tag) {
2561
	  INT64 v;
2556
	  INT64 v;
2562
	  low_INT64(v) = no(r);
2557
	  low_INT64(v) = no(r);
2563
	  load_store_immediate(i_ldil,d,v);
2558
	  load_store_immediate(i_ldil,d,v);
2564
	}
2559
	}
2565
	else operate_fmt(i_bis,no(r),no(r),d);
2560
	else operate_fmt(i_bis,no(r),no(r),d);
2566
	set_label_no_clear(l);
2561
	set_label_no_clear(l);
2567
	setreorder();
2562
	setreorder();
2568
      }	
2563
      }
2569
      else
2564
      else
2570
	if (name(e)==abslike_tag) {
2565
	if (name(e) ==abslike_tag) {
2571
	  int l1 = new_label();
2566
	  int l1 = new_label();
2572
	  int l2 = new_label();
2567
	  int l2 = new_label();
2573
	  setnoreorder();
2568
	  setnoreorder();
2574
	  integer_branch(i_bne,d,l2);
2569
	  integer_branch(i_bne,d,l2);
2575
	  operate_fmt(i_subq, 31, a1, d);
2570
	  operate_fmt(i_subq, 31, a1, d);
2576
	  integer_branch(i_br,31,l1);
2571
	  integer_branch(i_br,31,l1);
2577
	  set_label(l2);
2572
	  set_label(l2);
2578
	  operate_fmt(i_bis,a1,a1,d);
2573
	  operate_fmt(i_bis,a1,a1,d);
2579
 
2574
 
2580
	  set_label_no_clear(l1);
2575
	  set_label_no_clear(l1);
2581
	  setreorder();		
2576
	  setreorder();
2582
	}			
2577
	}
2583
      setregalt (aa, d);
2578
      setregalt(aa, d);
2584
      move (aa,dest, guardreg (d, sp), 0);
2579
      move(aa,dest, guardreg(d, sp), 0);
2585
      mka.regmove = d;
2580
      mka.regmove = d;
2586
      return mka;
2581
      return mka;
2587
    }			/* end absbool */
2582
    }			/* end absbool */
2588
      
-
 
2589
 
2583
 
-
 
2584
 
2590
    case test_tag : {
2585
    case test_tag: {
2591
      /*
2586
      /*
2592
	Tests are performed by either a comparison or subraction
2587
	Tests are performed by either a comparison or subraction
2593
	instruction, followed by a conditional branch.  If the
2588
	instruction, followed by a conditional branch.  If the
2594
	test is unsigned, or if a subtraction could cause an
2589
	test is unsigned, or if a subtraction could cause an
2595
	overflow, then comparisons must be used.
2590
	overflow, then comparisons must be used.
2596
	*/
2591
	*/
2597
      exp l = son (e);
2592
      exp l = son(e);
2598
      exp r = bro (l);
2593
      exp r = bro(l);
2599
      int   lab = (ptno (e) < 0) ? -ptno (e) : no (son (pt (e))); /* !! */
2594
      int   lab = (ptno (e) < 0) ? -ptno (e) : no (son (pt (e))); /* !! */
2600
      /* see frig in cond_tag */
2595
      /* see frig in cond_tag */
2601
      shape shl = sh (l);
2596
      shape shl = sh(l);
2602
      instruction test_ins;
2597
      instruction test_ins;
2603
      int   n = (props (e)) & 127; /* could have Rev bit in props*/
2598
      int   n = (props (e)) & 127; /* could have Rev bit in props*/
2604
      bool rev;
2599
      bool rev;
2605
      bool is_compare = ((!is_signed(shl)) && ((n-5)<0) && 
2600
      bool is_compare = ((!is_signed(shl)) && ((n-5) <0) &&
2606
			 (name(shl)!=ptrhd))||((is64(shl)));
2601
			(name(shl)!=ptrhd)) || ((is64(shl)));
2607
      is_compare = TRUE;
2602
      is_compare = TRUE;
2608
      if (is_floating (name (sh (l)))) {
2603
      if (is_floating(name(sh(l)))) {
2609
	instruction compare_ins;
2604
	instruction compare_ins;
2610
	space nsp;
2605
	space nsp;
2611
	int rev;
2606
	int rev;
2612
	int a1,a2,dest;
2607
	int a1,a2,dest;
2613
	a1 = freg_operand(l,sp);
2608
	a1 = freg_operand(l,sp);
Line 2616... Line 2611...
2616
	dest = getfreg(nsp.flt);
2611
	dest = getfreg(nsp.flt);
2617
	rev = fdouble_comparisons(&compare_ins,n);
2612
	rev = fdouble_comparisons(&compare_ins,n);
2618
	float_op(compare_ins,a1,a2,dest);
2613
	float_op(compare_ins,a1,a2,dest);
2619
	float_branch(rev?i_fbeq:i_fbne,dest,lab);
2614
	float_branch(rev?i_fbeq:i_fbne,dest,lab);
2620
	return mka;
2615
	return mka;
2621
      }           
2616
      }
2622
      else {
2617
      else {
2623
	int   a1;
2618
	int   a1;
2624
	int   a2;
2619
	int   a2;
2625
	if (name (l) == val_tag) {/* put literal operand on right */
2620
	if (name (l) == val_tag) {/* put literal operand on right */
2626
	  exp temp = l;
2621
	  exp temp = l;
Line 2632... Line 2627...
2632
	  else
2627
	  else
2633
	    if (n <= 4) {
2628
	    if (n <= 4) {
2634
	      n -= 2;
2629
	      n -= 2;
2635
	    }
2630
	    }
2636
	}
2631
	}
2637
	if(is_compare){
2632
	if (is_compare) {
2638
	  rev = comparisons(&test_ins,shl, n);
2633
	  rev = comparisons(&test_ins,shl, n);
2639
	}
2634
	}
2640
	else{
2635
	else{
2641
	  rev = 0;
2636
	  rev = 0;
2642
	  test_ins = sbranches(n);
2637
	  test_ins = sbranches(n);
2643
	}
2638
	}
2644
	a1 = reg_operand (l, sp);
2639
	a1 = reg_operand(l, sp);
2645
	if (name (r) == val_tag) {	
2640
	if (name(r) == val_tag) {
2646
	  space nsp;
2641
	  space nsp;
2647
	  int rtemp;
2642
	  int rtemp;
2648
	  
2643
 
2649
	  switch(name(sh(r))){
2644
	  switch (name(sh(r))) {
2650
	    case ucharhd :{
2645
	    case ucharhd:{
2651
	      no(r) = (unsigned char)no(r);
2646
	      no(r) = (unsigned char)no(r);
2652
	      break;
2647
	      break;
2653
	    }
2648
	    }
2654
	    case scharhd :{
2649
	    case scharhd:{
2655
	      no(r) = (char)no(r);
2650
	      no(r) = (char)no(r);
2656
	      break;
2651
	      break;
2657
	    }
2652
	    }
2658
	    case swordhd :{
2653
	    case swordhd:{
2659
	      no(r) = (short)no(r);
2654
	      no(r) = (short)no(r);
2660
	      break;
2655
	      break;
2661
	    }
2656
	    }
2662
	    case uwordhd :{
2657
	    case uwordhd:{
2663
	      no(r) = (unsigned short)no(r);
2658
	      no(r) = (unsigned short)no(r);
2664
	      break;
2659
	      break;
2665
	    }
2660
	    }
2666
	  }
2661
	  }
2667
	  	      
-
 
2668
 
2662
 
-
 
2663
 
2669
	  if((no(r)!=0)||(isbigval(r))){
2664
	  if ((no(r)!=0) || (isbigval(r))) {
2670
	    nsp=guardreg(a1,sp);
2665
	    nsp=guardreg(a1,sp);
2671
	    rtemp=getreg(nsp.fixed);
2666
	    rtemp=getreg(nsp.fixed);
2672
	    if(is_compare){
2667
	    if (is_compare) {
2673
	      if(isbigval(r)){
2668
	      if (isbigval(r)) {
2674
		operate_fmt_big_immediate(test_ins,a1,exp_to_INT64(r),rtemp);
2669
		operate_fmt_big_immediate(test_ins,a1,exp_to_INT64(r),rtemp);
2675
	      }
2670
	      }
2676
	      else{
2671
	      else{
2677
		operate_fmt_immediate(test_ins,a1,no(r),rtemp);
2672
		operate_fmt_immediate(test_ins,a1,no(r),rtemp);
2678
	      }
2673
	      }
2679
	      integer_branch(rev?i_beq:i_bne,rtemp,lab);
2674
	      integer_branch(rev?i_beq:i_bne,rtemp,lab);
2680
	    }
2675
	    }
2681
	    else{
2676
	    else{
2682
	      if(name(shl)==ulonghd){
2677
	      if (name(shl) ==ulonghd) {
2683
		operate_fmt_immediate(i_addl,a1,0,a1);
2678
		operate_fmt_immediate(i_addl,a1,0,a1);
2684
	      }
2679
	      }
2685
	      if(isbigval(r)){
2680
	      if (isbigval(r)) {
2686
		INT64 res = flt64_to_INT64(exp_to_f64(r));
2681
		INT64 res = flt64_to_INT64(exp_to_f64(r));
2687
		operate_fmt_big_immediate(i_subq,a1,res,rtemp);
2682
		operate_fmt_big_immediate(i_subq,a1,res,rtemp);
2688
	      }
2683
	      }
2689
	      else{
2684
	      else{
2690
		operate_fmt_immediate(i_subq,a1,no(r),rtemp);
2685
		operate_fmt_immediate(i_subq,a1,no(r),rtemp);
2691
	      }
2686
	      }
2692
	      integer_branch(test_ins,rtemp,lab);	
2687
	      integer_branch(test_ins,rtemp,lab);
2693
	    }
2688
	    }
2694
	  }
2689
	  }
2695
	  else{
2690
	  else{
2696
	    if(is_compare){
2691
	    if (is_compare) {
2697
	      int rtmp=getreg(guardreg(a1,sp).fixed);
2692
	      int rtmp=getreg(guardreg(a1,sp).fixed);
2698
	      if(is_signed(shl)){
2693
	      if (is_signed(shl)) {
2699
		test_ins = sbranches(n);
2694
		test_ins = sbranches(n);
2700
		integer_branch(test_ins,a1,lab);
2695
		integer_branch(test_ins,a1,lab);
2701
	      }
2696
	      }
2702
	      else{
2697
	      else{
2703
		operate_fmt(test_ins,a1,31,rtmp);
2698
		operate_fmt(test_ins,a1,31,rtmp);
2704
		integer_branch(rev?i_beq:i_bne,rtmp,lab);
2699
		integer_branch(rev?i_beq:i_bne,rtmp,lab);
2705
	      }
2700
	      }
2706
	    }
2701
	    }
2707
	    else{
2702
	    else{
2708
	      int dreg=a1;
2703
	      int dreg=a1;
2709
	      integer_branch(test_ins,dreg,lab);
2704
	      integer_branch(test_ins,dreg,lab);
2710
	    }
2705
	    }
2711
	  }
2706
	  }
2712
	}
2707
	}
2713
	else {
2708
	else {
2714
	  space nsp;
2709
	  space nsp;
2715
	  int rtemp;
2710
	  int rtemp;
2716
	  nsp = guardreg (a1, sp);
2711
	  nsp = guardreg(a1, sp);
2717
	  a2 = reg_operand (r, nsp);
2712
	  a2 = reg_operand(r, nsp);
2718
	  if(a2!=31){
2713
	  if (a2!=31) {
2719
	    rtemp=getreg(guardreg(a2,nsp).fixed);
2714
	    rtemp=getreg(guardreg(a2,nsp).fixed);
2720
	    if(is_compare){
2715
	    if (is_compare) {
2721
	      operate_fmt(test_ins,a1,a2,rtemp);
2716
	      operate_fmt(test_ins,a1,a2,rtemp);
2722
	      integer_branch(rev?i_beq:i_bne,rtemp,lab);
2717
	      integer_branch(rev?i_beq:i_bne,rtemp,lab);
2723
	    }
2718
	    }
2724
	    else{
2719
	    else{
2725
	      operate_fmt(is64(sh(son(e)))?i_subq:i_subl,a1,a2,
2720
	      operate_fmt(is64(sh(son(e)))?i_subq:i_subl,a1,a2,
2726
			  rtemp);	
2721
			  rtemp);
2727
	      integer_branch(test_ins,rtemp,lab);	
2722
	      integer_branch(test_ins,rtemp,lab);
2728
	    }
2723
	    }
2729
	  }
2724
	  }
2730
	  else{
2725
	  else{
2731
	    test_ins = sbranches(n);
2726
	    test_ins = sbranches(n);
2732
	    integer_branch(test_ins,a1,lab);
2727
	    integer_branch(test_ins,a1,lab);
Line 2734... Line 2729...
2734
	}
2729
	}
2735
	return mka;
2730
	return mka;
2736
      }		  /* end int test */
2731
      }		  /* end int test */
2737
    }			/* end test */
2732
    }			/* end test */
2738
 
2733
 
2739
    case ass_tag : 
2734
    case ass_tag:
2740
    case assvol_tag : {
2735
    case assvol_tag: {
2741
      exp lhs = son (e);
2736
      exp lhs = son(e);
2742
      exp rhs = bro (lhs);
2737
      exp rhs = bro(lhs);
2743
      where assdest;
2738
      where assdest;
2744
      space nsp;
2739
      space nsp;
2745
      ash arhs;
2740
      ash arhs;
2746
       
2741
 
2747
      int   contreg = NOREG;
2742
      int   contreg = NOREG;
2748
      if (name (e) == assvol_tag) {
2743
      if (name(e) == assvol_tag) {
2749
	clear_all ();
2744
	clear_all();
2750
	/*setvolatile ();*/
2745
	/*setvolatile ();*/
2751
      }
2746
      }
2752
 
2747
 
2753
      arhs = ashof (sh (rhs));
2748
      arhs = ashof(sh(rhs));
2754
 
2749
 
2755
      if (name (e) == ass_tag && name (rhs) == apply_tag &&
2750
      if (name(e) == ass_tag && name(rhs) == apply_tag &&
2756
	  (is_floating (name (sh (rhs))) || valregable (sh (rhs)))) {
2751
	 (is_floating(name(sh(rhs))) || valregable(sh(rhs)))) {
2757
	/* if source is simple proc call, evaluate it first and do
2752
	/* if source is simple proc call, evaluate it first and do
2758
	   assignment */
2753
	   assignment */
2759
	ans aa;
2754
	ans aa;
2760
	code_here (rhs, sp, nowhere);
2755
	code_here(rhs, sp, nowhere);
2761
	if (is_floating (name (sh (rhs)))) {
2756
	if (is_floating(name(sh(rhs)))) {
2762
	  freg frg;
2757
	  freg frg;
2763
	  frg.fr = 0;
2758
	  frg.fr = 0;
2764
	  if(arhs.ashsize==64)
2759
	  if (arhs.ashsize==64)
2765
	    frg.type = IEEE_double;
2760
	    frg.type = IEEE_double;
2766
	  else
2761
	  else
2767
	    frg.type = IEEE_single;
2762
	    frg.type = IEEE_single;
2768
	  setfregalt (aa, frg);
2763
	  setfregalt(aa, frg);
2769
	}
2764
	}
2770
	else {
2765
	else {
2771
	  setregalt (aa, RESULT_REG);
2766
	  setregalt(aa, RESULT_REG);
2772
	}
2767
	}
2773
	assdest = locate (lhs, guardreg(RESULT_REG,sp), sh (rhs), NO_REG);
2768
	assdest = locate(lhs, guardreg(RESULT_REG,sp), sh(rhs), NO_REG);
2774
	move (aa,assdest, sp, 1);
2769
	move(aa,assdest, sp, 1);
2775
	move (aa,dest, sp, 1);
2770
	move(aa,dest, sp, 1);
2776
	clear_dep_reg (lhs);
2771
	clear_dep_reg(lhs);
2777
	return mka;
2772
	return mka;
2778
      }
2773
      }
2779
 
2774
 
2780
/*	if (al1(sh(lhs)) == 1 || arhs.ashalign == 1)
2775
/*	if (al1(sh(lhs)) == 1 || arhs.ashalign == 1)
2781
	clear_reg (0);*/
2776
	clear_reg (0);*/
2782
 
2777
 
2783
      assdest = locate (lhs, sp, sh (rhs), NO_REG);
2778
      assdest = locate(lhs, sp, sh(rhs), NO_REG);
2784
      nsp = guard (assdest, sp);
2779
      nsp = guard(assdest, sp);
2785
      /* evaluate address of destination */
2780
      /* evaluate address of destination */
2786
 
2781
 
2787
      if (assdest.ashwhere.ashalign == 1) {
2782
      if (assdest.ashwhere.ashalign == 1) {
2788
	/* this is an assignment of a bitfield, so get address 
2783
	/* this is an assignment of a bitfield, so get address
2789
	   in proper form */
2784
	   in proper form */
2790
	instore is;
2785
	instore is;
2791
	switch (assdest.answhere.discrim) {
2786
	switch (assdest.answhere.discrim) {
2792
	  case inreg : {
2787
	  case inreg: {
2793
	    is.b.base = regalt (assdest.answhere);
2788
	    is.b.base = regalt(assdest.answhere);
2794
	    is.b.offset = 0;
2789
	    is.b.offset = 0;
2795
	    is.adval = 1;
2790
	    is.adval = 1;
2796
	    break;
2791
	    break;
2797
	  }
2792
	  }
2798
	  case notinreg : {
2793
	  case notinreg: {
2799
	    is = insalt (assdest.answhere);
2794
	    is = insalt(assdest.answhere);
2800
	    if (!is.adval) {
2795
	    if (!is.adval) {
2801
	      int   r = getreg (nsp.fixed);
2796
	      int   r = getreg(nsp.fixed);
2802
	      load_store(i_ldq,r,is.b);
2797
	      load_store(i_ldq,r,is.b);
2803
	      nsp = guardreg (r, nsp);
2798
	      nsp = guardreg(r, nsp);
2804
	      is.adval = 1;
2799
	      is.adval = 1;
2805
	      is.b.base = r;
2800
	      is.b.base = r;
2806
	      is.b.offset = 0;
2801
	      is.b.offset = 0;
2807
	    }
2802
	    }
2808
	    else {
2803
	    else {
2809
	      is.b.offset = is.b.offset << 3;
2804
	      is.b.offset = is.b.offset << 3;
2810
	    }
2805
	    }
2811
	    break;
2806
	    break;
2812
	  }
2807
	  }
2813
#if 0
2808
#if 0
2814
	  case bitad : {
2809
	  case bitad: {
2815
	    is = bitadalt (assdest.answhere);
2810
	    is = bitadalt(assdest.answhere);
2816
	    break;
2811
	    break;
2817
	  }
2812
	  }
2818
#endif
2813
#endif
2819
	  default: 
2814
	  default:
2820
	  failer ("Wrong assbits");
2815
	  failer("Wrong assbits");
2821
	}	
2816
	}
2822
/*	  setbitadalt (assdest.answhere, is);*/
2817
/*	  setbitadalt (assdest.answhere, is);*/
2823
      }	
2818
      }
2824
      else if (name (e) == ass_tag
2819
      else if (name(e) == ass_tag
2825
	       && assdest.answhere.discrim == notinreg
2820
	       && assdest.answhere.discrim == notinreg
2826
	       && assdest.ashwhere.ashsize == assdest.ashwhere.ashalign) {
2821
	       && assdest.ashwhere.ashsize == assdest.ashwhere.ashalign) {
2827
	instore is;
2822
	instore is;
2828
	is = insalt (assdest.answhere);
2823
	is = insalt(assdest.answhere);
2829
	if (!is.adval) {	
2824
	if (!is.adval) {
2830
	  /* this is an indirect assignment, so make
2825
	  /* this is an indirect assignment, so make
2831
	     it direct by loading pointer into a register
2826
	     it direct by loading pointer into a register
2832
	     (and remember it) */
2827
	     (and remember it) */
2833
	  int   r = getreg (nsp.fixed);
2828
	  int   r = getreg(nsp.fixed);
2834
	  load_store(i_ldq,r,is.b);
2829
	  load_store(i_ldq,r,is.b);
2835
	  nsp = guardreg (r, nsp);
2830
	  nsp = guardreg(r, nsp);
2836
	  is.adval = 1;
2831
	  is.adval = 1;
2837
	  is.b.base = r;
2832
	  is.b.base = r;
2838
	  is.b.offset = 0;
2833
	  is.b.offset = 0;
2839
	  setinsalt (assdest.answhere, is);
2834
	  setinsalt(assdest.answhere, is);
2840
	  keepexp (lhs, assdest.answhere);
2835
	  keepexp(lhs, assdest.answhere);
2841
	}
2836
	}
2842
      }
2837
      }
2843
      
2838
 
2844
      contreg = code_here (rhs, guard(assdest,nsp), assdest);
2839
      contreg = code_here(rhs, guard(assdest,nsp), assdest);
2845
      /* 
2840
      /*
2846
	 evaluate source into assignment destination  
2841
	 evaluate source into assignment destination
2847
	 and move it into dest - could use assignment as value 
2842
	 and move it into dest - could use assignment as value
2848
	 */
2843
	 */
2849
 
2844
 
2850
      switch (assdest.answhere.discrim) {
2845
      switch (assdest.answhere.discrim) {
2851
	case inreg : {
2846
	case inreg: {
2852
	  int   a = regalt (assdest.answhere);
2847
	  int   a = regalt(assdest.answhere);
2853
	  keepreg (rhs, a);
2848
	  keepreg(rhs, a);
2854
	  /* remember that source has been evaluated into a */
2849
	  /* remember that source has been evaluated into a */
2855
	  clear_dep_reg (lhs);
2850
	  clear_dep_reg(lhs);
2856
	  /* forget register dependencies on destination */
2851
	  /* forget register dependencies on destination */
2857
	  move (assdest.answhere,dest, nsp, 1);
2852
	  move(assdest.answhere,dest, nsp, 1);
2858
	  break;
2853
	  break;
2859
	}
2854
	}
2860
	case infreg :{
2855
	case infreg:{
2861
	  freg frg;
2856
	  freg frg;
2862
	  int   r;
2857
	  int   r;
2863
	  frg = fregalt (assdest.answhere);
2858
	  frg = fregalt(assdest.answhere);
2864
	  r = frg.fr + 32;
2859
	  r = frg.fr + 32;
2865
	  if (frg.type==IEEE_double) {
2860
	  if (frg.type==IEEE_double) {
2866
	    r = -r;
2861
	    r = -r;
2867
	  };
2862
	  };
2868
	  keepreg (rhs, r);
2863
	  keepreg(rhs, r);
2869
	  /* remember that source has been evaluated into a */
2864
	  /* remember that source has been evaluated into a */
2870
	  clear_dep_reg (lhs);
2865
	  clear_dep_reg(lhs);
2871
	  /* forget register dependencies on destination */
2866
	  /* forget register dependencies on destination */
2872
	  move (assdest.answhere,dest, nsp, 1);
2867
	  move(assdest.answhere,dest, nsp, 1);
2873
	  break;
2868
	  break;
2874
	}
2869
	}
2875
	case notinreg : /*case bitad: */{
2870
	case notinreg : /*case bitad: */{
2876
	  if (contreg != NOREG && name (e) == ass_tag) {
2871
	  if (contreg != NOREG && name(e) == ass_tag) {
2877
	    ans aa;
2872
	    ans aa;
2878
	    space nnsp;
2873
	    space nnsp;
2879
	    if (contreg > 0 && contreg < 31) {
2874
	    if (contreg > 0 && contreg < 31) {
2880
	      setregalt (aa, contreg);
2875
	      setregalt(aa, contreg);
2881
	      nnsp = guardreg (contreg, sp);
2876
	      nnsp = guardreg(contreg, sp);
2882
	    }
2877
	    }
2883
	    else {
2878
	    else {
2884
	      freg frg;
2879
	      freg frg;
2885
	      frg.fr = abs (contreg) - 32;
2880
	      frg.fr = abs(contreg) - 32;
2886
	      if(contreg<0)
2881
	      if (contreg<0)
2887
		frg.type = IEEE_double;
2882
		frg.type = IEEE_double;
2888
	      else 
2883
	      else
2889
		frg.type = IEEE_single;
2884
		frg.type = IEEE_single;
2890
	      nnsp = nsp;
2885
	      nnsp = nsp;
2891
	      setfregalt (aa, frg);
2886
	      setfregalt(aa, frg);
2892
	    }
2887
	    }
2893
	    move (aa,dest, nnsp, 1);
2888
	    move(aa,dest, nnsp, 1);
2894
	    clear_dep_reg (lhs);
2889
	    clear_dep_reg(lhs);
2895
	    /* forget register dependencies on destination */
2890
	    /* forget register dependencies on destination */
2896
	    if (name (lhs) == name_tag || !dependson (lhs, 0, lhs)) {
2891
	    if (name(lhs) == name_tag || !dependson(lhs, 0, lhs)) {
2897
	      /* remember that dest contains source, 
2892
	      /* remember that dest contains source,
2898
		 provided that it is not dependent on it */
2893
		 provided that it is not dependent on it */
2899
	      keepcont (lhs, contreg);
2894
	      keepcont(lhs, contreg);
2900
	    }
2895
	    }
2901
	    return mka;
2896
	    return mka;
2902
	  }
2897
	  }
2903
	  clear_dep_reg (lhs);
2898
	  clear_dep_reg(lhs);
2904
	  /* forget register dependencies on destination */
2899
	  /* forget register dependencies on destination */
2905
	  move (assdest.answhere,dest, nsp, 1);
2900
	  move(assdest.answhere,dest, nsp, 1);
2906
	  break;
2901
	  break;
2907
	  case insomereg : case insomefreg : {
2902
	  case insomereg: case insomefreg: {
2908
	    clear_dep_reg (lhs);
2903
	    clear_dep_reg(lhs);
2909
	    /* forget register dependencies on destination */
2904
	    /* forget register dependencies on destination */
2910
	    move (assdest.answhere,dest, guard (assdest, sp), 1);
2905
	    move(assdest.answhere,dest, guard(assdest, sp), 1);
2911
	  }
2906
	  }
2912
	}	
2907
	}
2913
      }			/* end sw on answhere */
2908
      }			/* end sw on answhere */
2914
 
2909
 
2915
/*	if (name (e) == assvol_tag)*/
2910
/*	if (name (e) == assvol_tag)*/
2916
      /*setnovolatile ();*/
2911
      /*setnovolatile ();*/
2917
      return mka;
2912
      return mka;
2918
    }				/* end ass */
2913
    }				/* end ass */
2919
 
2914
 
2920
    case compound_tag : {
2915
    case compound_tag: {
2921
      exp t = son (e);
2916
      exp t = son(e);
2922
      space nsp;
2917
      space nsp;
2923
      instore str;
2918
      instore str;
2924
      int r;
2919
      int r;
2925
	
2920
 
2926
      nsp = sp;	
2921
      nsp = sp;
2927
      switch(dest.answhere.discrim) {
2922
      switch (dest.answhere.discrim) {
2928
	case notinreg : {
2923
	case notinreg: {
2929
	  str = insalt (dest.answhere);/* it should be !! */
2924
	  str = insalt (dest.answhere);/* it should be !! */
2930
	  if (!str.adval) {
2925
	  if (!str.adval) {
2931
	    int   r = getreg (sp.fixed);
2926
	    int   r = getreg(sp.fixed);
2932
	    nsp = guardreg (r, sp);
2927
	    nsp = guardreg(r, sp);
2933
	    load_store(i_ldq,r,str.b);
2928
	    load_store(i_ldq,r,str.b);
2934
	    str.adval = 1;
2929
	    str.adval = 1;
2935
	    str.b.base = r;
2930
	    str.b.base = r;
2936
	    str.b.offset = 0;
2931
	    str.b.offset = 0;
2937
	  }	
2932
	  }
2938
	  for (;;) {
2933
	  for (;;) {
2939
	    where newdest;
2934
	    where newdest;
2940
	    instore newis;
2935
	    instore newis;
2941
	    newis = str;
2936
	    newis = str;
2942
	    newis.b.offset += no(t);
2937
	    newis.b.offset += no(t);
2943
	    Assert(name(t)==val_tag && al2(sh(t)) >= 8);
2938
	    Assert(name(t) ==val_tag && al2(sh(t)) >= 8);
2944
	    setinsalt (newdest.answhere, newis);
2939
	    setinsalt(newdest.answhere, newis);
2945
	    newdest.ashwhere = ashof (sh(bro(t)));
2940
	    newdest.ashwhere = ashof(sh(bro(t)));
2946
	    code_here (bro(t), nsp, newdest);
2941
	    code_here(bro(t), nsp, newdest);
2947
	    if (last (bro(t))) {
2942
	    if (last(bro(t))) {
2948
	      return mka;
2943
	      return mka;
2949
	    }	
2944
	    }
2950
	    t = bro (bro(t));
2945
	    t = bro(bro(t));
2951
	  }	
2946
	  }
2952
	}
2947
	}
2953
	case insomereg : {
2948
	case insomereg: {
2954
	  int * sr = someregalt(dest.answhere);
2949
	  int * sr = someregalt(dest.answhere);
2955
	  if (*sr != -1) {
2950
	  if (*sr != -1) {
2956
	    failer ("Somereg *2");
2951
	    failer("Somereg *2");
2957
	  }		
2952
	  }
2958
	  *sr = getreg (sp.fixed);
2953
	  *sr = getreg(sp.fixed);
2959
	  setregalt (dest.answhere, *sr);
2954
	  setregalt(dest.answhere, *sr);
2960
	}                  
2955
	}
2961
	FALL_THROUGH;
2956
	FALL_THROUGH;
2962
	case inreg : {
2957
	case inreg: {
2963
	  code_here(bro(t), sp, dest);
2958
	  code_here(bro(t), sp, dest);
2964
	  r = regalt(dest.answhere);
2959
	  r = regalt(dest.answhere);
2965
	  Assert(name(t)==val_tag);
2960
	  Assert(name(t) ==val_tag);
2966
	  if (no(t) !=0) {
2961
	  if (no(t)!=0) {
2967
	    operate_fmt_immediate(i_sll, r, 
2962
	    operate_fmt_immediate(i_sll, r,
2968
				  (al2(sh(t)) >= 8)? (no(t)<<3):no(t),r);
2963
				 (al2(sh(t)) >= 8)?(no(t) <<3):no(t),r);
2969
	  }	
2964
	  }
2970
	  nsp = guardreg(r, sp);
2965
	  nsp = guardreg(r, sp);
2971
	  while(!last(bro(t))) {
2966
	  while (!last(bro(t))) {
2972
	    int z;
2967
	    int z;
2973
	    t = bro(bro(t));
2968
	    t = bro(bro(t));
2974
	    Assert(name(t)==val_tag);
2969
	    Assert(name(t) ==val_tag);
2975
	    z = reg_operand(bro(t), nsp);
2970
	    z = reg_operand(bro(t), nsp);
2976
	    if (no(t) !=0) {
2971
	    if (no(t)!=0) {
2977
	      operate_fmt_immediate
2972
	      operate_fmt_immediate
2978
		(i_sll, z, (al2(sh(t)) >= 8)? (no(t)<<3):no(t),z );
2973
		(i_sll, z,(al2(sh(t)) >= 8)?(no(t) <<3):no(t),z);
2979
	    }		
2974
	    }
2980
	    operate_fmt(i_bis, z, z, r);
2975
	    operate_fmt(i_bis, z, z, r);
2981
	  }	
2976
	  }
2982
	  return mka;
2977
	  return mka;
2983
	}
2978
	}
2984
	default: failer("No Tuples in freg");
2979
	default: failer("No Tuples in freg");
2985
      }
2980
      }
2986
      break;
2981
      break;
2987
    }				/* end tup */
2982
    }				/* end tup */
2988
      
2983
 
2989
    case nof_tag : 
2984
    case nof_tag:
2990
    case concatnof_tag :{
2985
    case concatnof_tag:{
2991
      exp t = son (e);
2986
      exp t = son(e);
2992
      space nsp;
2987
      space nsp;
2993
      instore str;
2988
      instore str;
2994
      int r, disp = 0;
2989
      int r, disp = 0;
2995
       
2990
 
2996
      nsp = sp;	
2991
      nsp = sp;
2997
      switch(dest.answhere.discrim) {
2992
      switch (dest.answhere.discrim) {
2998
	case notinreg : {
2993
	case notinreg: {
2999
	  str = insalt (dest.answhere);	/* it should be !! */
2994
	  str = insalt (dest.answhere);	/* it should be !! */
3000
	  if (!str.adval) {
2995
	  if (!str.adval) {
3001
	    int   r = getreg (sp.fixed);
2996
	    int   r = getreg(sp.fixed);
3002
	    nsp = guardreg (r, sp);
2997
	    nsp = guardreg(r, sp);
3003
	    load_store(i_ldq,r,str.b);
2998
	    load_store(i_ldq,r,str.b);
3004
	    str.adval = 1;
2999
	    str.adval = 1;
3005
	    str.b.base = r;
3000
	    str.b.base = r;
3006
	    str.b.offset = 0;
3001
	    str.b.offset = 0;
3007
	  }
3002
	  }
3008
	  for (;;) {
3003
	  for (;;) {
3009
	    where newdest;
3004
	    where newdest;
3010
	    instore newis;
3005
	    instore newis;
3011
	    if(t == nilexp) return mka;
3006
	    if (t == nilexp) return mka;
3012
	    newis = str;
3007
	    newis = str;
3013
	    newis.b.offset += disp;
3008
	    newis.b.offset += disp;
3014
	    setinsalt (newdest.answhere, newis);
3009
	    setinsalt(newdest.answhere, newis);
3015
	    newdest.ashwhere = ashof (sh(t));
3010
	    newdest.ashwhere = ashof(sh(t));
3016
	    code_here (t, nsp, newdest);
3011
	    code_here(t, nsp, newdest);
3017
	    if (last (t)) {
3012
	    if (last(t)) {
3018
	      return mka;
3013
	      return mka;
3019
	    }
3014
	    }
3020
	    disp+=(rounder(shape_size(sh(t)), shape_align(sh(bro(t))))>>3);
3015
	    disp+= (rounder(shape_size(sh(t)), shape_align(sh(bro(t)))) >>3);
3021
	    t =bro(t);
3016
	    t =bro(t);
3022
	  }
3017
	  }
3023
	}
3018
	}
3024
	case insomereg : {
3019
	case insomereg: {
3025
	  int * sr = someregalt(dest.answhere);
3020
	  int * sr = someregalt(dest.answhere);
3026
	  if (*sr != -1) {
3021
	  if (*sr != -1) {
3027
	    failer ("Somereg *2");
3022
	    failer("Somereg *2");
3028
	  }
3023
	  }
3029
	  *sr = getreg (sp.fixed);
3024
	  *sr = getreg(sp.fixed);
3030
	  setregalt (dest.answhere, *sr);
3025
	  setregalt(dest.answhere, *sr);
3031
	  /* ,... */
3026
	  /* ,... */
3032
	}                  
3027
	}
3033
	FALL_THROUGH;
3028
	FALL_THROUGH;
3034
	case inreg : {
3029
	case inreg: {
3035
	  if(t == nilexp) return mka;
3030
	  if (t == nilexp) return mka;
3036
	  code_here(t, sp, dest);
3031
	  code_here(t, sp, dest);
3037
	  r = regalt(dest.answhere);
3032
	  r = regalt(dest.answhere);
3038
	  nsp = guardreg(r, sp);
3033
	  nsp = guardreg(r, sp);
3039
	  while(!last(t)) {
3034
	  while (!last(t)) {
3040
	    int z;
3035
	    int z;
3041
	    disp+=rounder(shape_size(sh(t)), shape_align(sh(bro(t))));
3036
	    disp+=rounder(shape_size(sh(t)), shape_align(sh(bro(t))));
3042
	    t =bro(t);
3037
	    t =bro(t);
3043
	    z = reg_operand(t, nsp);
3038
	    z = reg_operand(t, nsp);
3044
	    operate_fmt_immediate(i_sll, z,disp,z );
3039
	    operate_fmt_immediate(i_sll, z,disp,z);
3045
	    operate_fmt(i_bis, z, z, r);
3040
	    operate_fmt(i_bis, z, z, r);
3046
	  }
3041
	  }
3047
	  return mka;
3042
	  return mka;
3048
	}
3043
	}
3049
	default: failer("No Tuples in freg");
3044
	default: failer("No Tuples in freg");
3050
      }
3045
      }
3051
      break;
3046
      break;
3052
    }
3047
    }
3053
      
3048
 
3054
    case ncopies_tag :{
3049
    case ncopies_tag:{
3055
      exp t = son (e);
3050
      exp t = son(e);
3056
      space nsp;
3051
      space nsp;
3057
      instore str;
3052
      instore str;
3058
      int i, r, disp = 0;
3053
      int i, r, disp = 0;
3059
      nsp = sp;	
3054
      nsp = sp;
3060
      switch(dest.answhere.discrim) {
3055
      switch (dest.answhere.discrim) {
3061
	case notinreg : {
3056
	case notinreg: {
3062
	  str = insalt (dest.answhere); /* it should be !! */
3057
	  str = insalt (dest.answhere); /* it should be !! */
3063
	  if (!str.adval) {
3058
	  if (!str.adval) {
3064
	    int   r = getreg (sp.fixed);
3059
	    int   r = getreg(sp.fixed);
3065
	    nsp = guardreg (r, sp);
3060
	    nsp = guardreg(r, sp);
3066
	    load_store(i_ldq,r,str.b);
3061
	    load_store(i_ldq,r,str.b);
3067
	    str.adval = 1;
3062
	    str.adval = 1;
3068
	    str.b.base = r;
3063
	    str.b.base = r;
3069
	    str.b.offset = 0;
3064
	    str.b.offset = 0;
3070
	  }	
3065
	  }
3071
	  for (i=1;i<=no(e); i++) {
3066
	  for (i=1;i<=no(e); i++) {
3072
	    where newdest;
3067
	    where newdest;
3073
	    instore newis;
3068
	    instore newis;
3074
	    newis = str;
3069
	    newis = str;
3075
	    newis.b.offset += disp;
3070
	    newis.b.offset += disp;
3076
	    setinsalt (newdest.answhere, newis);
3071
	    setinsalt(newdest.answhere, newis);
3077
	    newdest.ashwhere = ashof (sh(t));
3072
	    newdest.ashwhere = ashof(sh(t));
3078
	    code_here (t, nsp, newdest);
3073
	    code_here(t, nsp, newdest);
3079
	    disp+=(rounder(shape_size(sh(t)), shape_align(sh(t)))>>3);
3074
	    disp+= (rounder(shape_size(sh(t)), shape_align(sh(t))) >>3);
3080
	  }	
3075
	  }
3081
	  return mka;
3076
	  return mka;
3082
	}
3077
	}
3083
	case insomereg : {
3078
	case insomereg: {
3084
	  int * sr = someregalt(dest.answhere);
3079
	  int * sr = someregalt(dest.answhere);
3085
	  if (*sr != -1) {
3080
	  if (*sr != -1) {
3086
	    failer ("Somereg *2");
3081
	    failer("Somereg *2");
3087
	  }		
3082
	  }
3088
	  *sr = getreg (sp.fixed);
3083
	  *sr = getreg(sp.fixed);
3089
	  setregalt (dest.answhere, *sr);
3084
	  setregalt(dest.answhere, *sr);
3090
	}                  
3085
	}
3091
	FALL_THROUGH;
3086
	FALL_THROUGH;
3092
	case inreg: {
3087
	case inreg: {
3093
	  code_here(t, sp, dest);
3088
	  code_here(t, sp, dest);
3094
	  r = regalt(dest.answhere);
3089
	  r = regalt(dest.answhere);
3095
	  nsp = guardreg(r, sp);
3090
	  nsp = guardreg(r, sp);
3096
	  for(i=1; i<=no(e); i++) {
3091
	  for (i=1; i<=no(e); i++) {
3097
	    int z;
3092
	    int z;
3098
	    disp+=rounder(shape_size(sh(t)), shape_align(sh(t)));
3093
	    disp+=rounder(shape_size(sh(t)), shape_align(sh(t)));
3099
	    z = reg_operand(t, nsp);
3094
	    z = reg_operand(t, nsp);
3100
	    operate_fmt_immediate(i_sll, z,disp,z);
3095
	    operate_fmt_immediate(i_sll, z,disp,z);
3101
	    operate_fmt(i_bis, z, z, r);
3096
	    operate_fmt(i_bis, z, z, r);
3102
	  }	
3097
	  }
3103
	  return mka;
3098
	  return mka;
3104
	}
3099
	}
3105
	default: failer("No Tuples in freg");
3100
	default: failer("No Tuples in freg");
3106
      }
3101
      }
3107
      break;
3102
      break;
3108
    }           
3103
    }
3109
    case apply_tag :{
3104
    case apply_tag:{
3110
      exp fn = son (e);
3105
      exp fn = son(e);
3111
      exp par = bro (fn);
3106
      exp par = bro(fn);
3112
      exp list = par;
3107
      exp list = par;
3113
      int   hda = name (sh (e));
3108
      int   hda = name(sh(e));
3114
      int   disp;
3109
      int   disp;
3115
      int   spar;
3110
      int   spar;
3116
      int   fpar = 16;
3111
      int   fpar = 16;
3117
      ash ansash;
3112
      ash ansash;
3118
      bool hadfixed;
3113
      bool hadfixed;
3119
      instore is;
3114
      instore is;
3120
      is.b.base = SP;
3115
      is.b.base = SP;
3121
      is.b.offset = 0;
3116
      is.b.offset = 0;
3122
      is.adval = 1;
3117
      is.adval = 1;
3123
       
3118
 
3124
#ifdef DO_SPECIAL
3119
#ifdef DO_SPECIAL
3125
      if ((disp = specialfn (fn)) > 0) { /* eg function is strlen */
3120
      if ((disp = specialfn (fn)) > 0) { /* eg function is strlen */
3126
	mka.lab = specialmake (disp, list, sp, dest, exitlab);
3121
	mka.lab = specialmake(disp, list, sp, dest, exitlab);
3127
	return mka;
3122
	return mka;
3128
 
3123
 
3129
      }
3124
      }
3130
#endif
3125
#endif
3131
      ansash = ashof (sh (e));
3126
      ansash = ashof(sh(e));
3132
      disp = 0;
3127
      disp = 0;
3133
      spar = FIRST_INT_ARG;/* register holding 1st integer parameter */
3128
      spar = FIRST_INT_ARG;/* register holding 1st integer parameter */
3134
      hadfixed = 0;
3129
      hadfixed = 0;
3135
       
3130
 
3136
       
3131
 
3137
      if (!last(fn)) {
3132
      if (!last(fn)) {
3138
	for (;;) {		/* evaluate parameters in turn */
3133
	for (;;) {		/* evaluate parameters in turn */
3139
	  int   hd = name (sh (list));
3134
	  int   hd = name(sh(list));
3140
	  where w;
3135
	  where w;
3141
	  ash ap;
3136
	  ash ap;
3142
	  int paral;
3137
	  int paral;
3143
	  int parsize;
3138
	  int parsize;
3144
	  ap = ashof (sh (list));
3139
	  ap = ashof(sh(list));
3145
	  paral = (ap.ashalign < 32)?32:ap.ashalign;
3140
	  paral = (ap.ashalign < 32)?32:ap.ashalign;
3146
	  if(spar>21){
3141
	  if (spar>21) {
3147
	    ap.ashalign=64;
3142
	    ap.ashalign=64;
3148
	    paral = 64;
3143
	    paral = 64;
3149
	  }
3144
	  }
3150
	  parsize = ap.ashsize;
3145
	  parsize = ap.ashsize;
3151
	  /* all parameters passed on stack are quadword aligned */
3146
	  /* all parameters passed on stack are quadword aligned */
Line 3156... Line 3151...
3156
	  if (disp>448) {spar =22; fpar = 22; }
3151
	  if (disp>448) {spar =22; fpar = 22; }
3157
	  if (is_floating(hd) && disp+parsize <= 384) {
3152
	  if (is_floating(hd) && disp+parsize <= 384) {
3158
	    freg frg;
3153
	    freg frg;
3159
	    ans ansfr;
3154
	    ans ansfr;
3160
	    frg.fr = fpar++;
3155
	    frg.fr = fpar++;
3161
	    if(hd != shrealhd)
3156
	    if (hd != shrealhd)
3162
	      frg.type = IEEE_double;
3157
	      frg.type = IEEE_double;
3163
	    else
3158
	    else
3164
	      frg.type = IEEE_single;
3159
	      frg.type = IEEE_single;
3165
	    setfregalt (ansfr, frg);
3160
	    setfregalt(ansfr, frg);
3166
	    w.answhere = ansfr;
3161
	    w.answhere = ansfr;
3167
	    code_here (list, sp, w);
3162
	    code_here(list, sp, w);
3168
	    /* eval parameter into floating parameter register */
3163
	    /* eval parameter into floating parameter register */
3169
	    sp = guardfreg(frg.fr, sp);
3164
	    sp = guardfreg(frg.fr, sp);
3170
	  }
3165
	  }
3171
	  else if(((valregable(sh(list)) || (name(sh(list))==cpdhd)) ||
3166
	  else if (((valregable(sh(list)) || (name(sh(list)) ==cpdhd)) ||
3172
		   (name(sh(list))==nofhd)) && spar<=21){	
3167
		  (name(sh(list)) ==nofhd)) && spar<=21) {
3173
	    /* compound types are always passed in registers
3168
	    /* compound types are always passed in registers
3174
	       (given enough space). */
3169
	       (given enough space). */
3175
	    ans ansr;
3170
	    ans ansr;
3176
	    int par_reg;
3171
	    int par_reg;
3177
	    int numleft = parsize-((LAST_INT_ARG-spar+1)<<6);
3172
	    int numleft = parsize- ((LAST_INT_ARG-spar+1) <<6);
3178
	    int pregs_used = min((numleft>>6)+6,6);
3173
	    int pregs_used = min((numleft>>6) +6,6);
3179
	    hadfixed=1;
3174
	    hadfixed=1;
3180
	    setregalt(ansr,spar);
3175
	    setregalt(ansr,spar);
3181
	    w.answhere=ansr;
3176
	    w.answhere=ansr;
3182
	    for(par_reg=spar;par_reg<spar+pregs_used;++par_reg){
3177
	    for (par_reg=spar;par_reg<spar+pregs_used;++par_reg) {
3183
	      sp = guardreg(par_reg,sp);
3178
	      sp = guardreg(par_reg,sp);
3184
	    }
3179
	    }
3185
	     
3180
 
3186
 
3181
 
3187
	    sp = guardreg(spar,sp);
3182
	    sp = guardreg(spar,sp);
3188
	    code_here(list,sp,w);
3183
	    code_here(list,sp,w);
3189
	    if(numleft>0){
3184
	    if (numleft>0) {
3190
	      is.b.offset+=(numleft>>3); /* += number of bytes remaining */
3185
	      is.b.offset+=(numleft>>3); /* += number of bytes remaining */
3191
	    }
3186
	    }
3192
	  }
3187
	  }
3193
	  else {
3188
	  else {
3194
	    /* pass remaining parameters on the stack.  
3189
	    /* pass remaining parameters on the stack.
3195
	       The parameters are aligned on 8 byte boundaries. 
3190
	       The parameters are aligned on 8 byte boundaries.
3196
	       */
3191
	       */
3197
	    setinsalt (w.answhere, is);
3192
	    setinsalt(w.answhere, is);
3198
	    is.b.offset+=(max(ap.ashsize,REG_SIZE)>>3);	
3193
	    is.b.offset+= (max(ap.ashsize,REG_SIZE) >>3);
3199
	    /* 'size' was used here */
3194
	    /* 'size' was used here */
3200
	    code_here (list, sp, w);
3195
	    code_here(list, sp, w);
3201
	    hadfixed = 1;
3196
	    hadfixed = 1;
3202
	    /* eval parameter into argument space on stack */
3197
	    /* eval parameter into argument space on stack */
3203
	  }	
3198
	  }
3204
	  if(name(list) == caller_tag){
3199
	  if (name(list) == caller_tag) {
3205
	    no(list) = disp;
3200
	    no(list) = disp;
3206
	  }
3201
	  }
3207
	  disp+=parsize;
3202
	  disp+=parsize;
3208
	  disp = rounder(disp, REG_SIZE);
3203
	  disp = rounder(disp, REG_SIZE);
3209
 
3204
 
3210
 
3205
 
3211
	  if (last (list)) break;
3206
	  if (last(list))break;
3212
	  list = bro (list);
3207
	  list = bro(list);
3213
	} /* end for */
3208
	} /* end for */
3214
      } /* end if list */
3209
      } /* end if list */
3215
       
3210
 
3216
      if (name (fn) == name_tag && name (son (fn)) == ident_tag
3211
      if (name(fn) == name_tag && name(son(fn)) == ident_tag
3217
	  && (son (son (fn)) == nilexp || name (son (son (fn))) == proc_tag)) {
3212
	  && (son(son(fn)) == nilexp || name(son(son(fn))) == proc_tag)) {
3218
	/* the procedure can be entered directly */
3213
	/* the procedure can be entered directly */
3219
	if (			/*!tlrecurse*/1) {
3214
	if (			/*!tlrecurse*/1) {
3220
	  baseoff a;
3215
	  baseoff a;
3221
	  integer_jump_external(i_jsr,26,boff(son(fn)));
3216
	  integer_jump_external(i_jsr,26,boff(son(fn)));
3222
	  a.base = RA;
3217
	  a.base = RA;
3223
	  a.offset=0;
3218
	  a.offset=0;
3224
	  load_store(i_ldgp,GP,a);
3219
	  load_store(i_ldgp,GP,a);
3225
	} 
3220
	}
3226
	else {
3221
	else {
3227
	  if (Has_fp) {
3222
	  if (Has_fp) {
3228
	    baseoff b;
3223
	    baseoff b;
3229
	    b.base = FP;
3224
	    b.base = FP;
3230
	    b.offset = (frame_size+ callee_size)>>3;
3225
	    b.offset = (frame_size+ callee_size) >>3;
3231
	    restore_sregs(fixdone, fltdone);
3226
	    restore_sregs(fixdone, fltdone);
3232
	    operate_fmt(i_bis,FP,FP,SP);
3227
	    operate_fmt(i_bis,FP,FP,SP);
3233
	    load_store(i_ldq,FP,b);
3228
	    load_store(i_ldq,FP,b);
3234
	  }	
3229
	  }
3235
	  else {
3230
	  else {
3236
	    baseoff b;
3231
	    baseoff b;
3237
	    b.base=SP;
3232
	    b.base=SP;
3238
	    b.offset=(frame_size+callee_size)>>3;
3233
	    b.offset= (frame_size+callee_size) >>3;
3239
	      
3234
 
3240
	    restore_sregs(fixdone, fltdone);
3235
	    restore_sregs(fixdone, fltdone);
3241
	    load_store(i_lda,SP,b);
3236
	    load_store(i_lda,SP,b);
3242
	  }	
3237
	  }
3243
	  integer_jump_external(i_jmp,31,boff(son(fn)));
3238
	  integer_jump_external(i_jmp,31,boff(son(fn)));
3244
	  if(as_file){
3239
	  if (as_file) {
3245
	    fprintf(as_file," # Tail recursion\n"); 
3240
	    fprintf(as_file," # Tail recursion\n");
3246
	  }
3241
	  }
3247
	   
3242
 
3248
	}	
3243
	}
3249
      }
3244
      }
3250
      else {			/* the address of the proc is evaluated
3245
      else {			/* the address of the proc is evaluated
3251
				   and entered indirectly */
3246
				   and entered indirectly */
3252
	int destreg=reg_operand(fn,guardreg(26,sp));
3247
	int destreg=reg_operand(fn,guardreg(26,sp));
3253
	operate_fmt(i_bis,destreg,destreg,PV);
3248
	operate_fmt(i_bis,destreg,destreg,PV);
3254
	integer_jump(i_jsr,RA,destreg,0);
3249
	integer_jump(i_jsr,RA,destreg,0);
3255
	load_store(i_ldgp,GP,procbase);
3250
	load_store(i_ldgp,GP,procbase);
3256
      }
3251
      }
3257
      if(in_general_proc) {
3252
      if (in_general_proc) {
3258
	/* Temporary */
3253
	/* Temporary */
3259
	/*	operate_fmt_immediate(i_addq,SP,(callee_size+frame_size)>>3,FP);*/
3254
	/*	operate_fmt_immediate(i_addq,SP,(callee_size+frame_size)>>3,FP);*/
3260
      }
3255
      }
3261
      clear_all ();		/* forget all register memories */
3256
      clear_all ();		/* forget all register memories */
3262
      {
3257
      {
3263
	ans aa;
3258
	ans aa;
3264
	if (is_floating (hda)) {
3259
	if (is_floating(hda)) {
3265
	  freg frg;
3260
	  freg frg;
3266
	  frg.fr = 0;
3261
	  frg.fr = 0;
3267
	  if(hda != shrealhd)
3262
	  if (hda != shrealhd)
3268
	    frg.type = IEEE_double;
3263
	    frg.type = IEEE_double;
3269
	  else
3264
	  else
3270
	    frg.type = IEEE_single;
3265
	    frg.type = IEEE_single;
3271
	  setfregalt (aa, frg);
3266
	  setfregalt(aa, frg);
3272
	  move (aa,dest, sp, 1);
3267
	  move(aa,dest, sp, 1);
3273
	  /* move floating point result of application 
3268
	  /* move floating point result of application
3274
	     to destination */
3269
	     to destination */
3275
	}
3270
	}
3276
	else {
3271
	else {
3277
	  setregalt (aa, RESULT_REG);
3272
	  setregalt(aa, RESULT_REG);
3278
	  mka.regmove = 0;
3273
	  mka.regmove = 0;
3279
	  move (aa,dest, sp, 1);
3274
	  move(aa,dest, sp, 1);
3280
	  /* move floating point result of application to 
3275
	  /* move floating point result of application to
3281
	     destination */
3276
	     destination */
3282
	}
3277
	}
3283
	/* else struct results are moved by body of proc */
3278
	/* else struct results are moved by body of proc */
3284
      }
3279
      }
3285
      return mka;
3280
      return mka;
3286
    }				/* end apply */
3281
    }				/* end apply */
3287
    case caller_tag : {
3282
    case caller_tag: {
3288
      e = son(e);
3283
      e = son(e);
3289
      goto tailrecurse;
3284
      goto tailrecurse;
3290
    }
3285
    }
3291
 
3286
 
3292
    case apply_general_tag : {
3287
    case apply_general_tag: {
3293
      exp fn = son(e);
3288
      exp fn = son(e);
3294
      exp callers = bro(fn);
3289
      exp callers = bro(fn);
3295
      exp cllees = bro(callers);
3290
      exp cllees = bro(callers);
3296
      exp postlude = bro(cllees);
3291
      exp postlude = bro(cllees);
3297
      space nsp;
3292
      space nsp;
3298
      int postlude_arg_space;
3293
      int postlude_arg_space;
3299
      nsp = sp;
3294
      nsp = sp;
3300
      if (no(callers) != 0){
3295
      if (no(callers)!= 0) {
3301
	nsp = do_callers(son(callers),sp,&sizecallers);
3296
	nsp = do_callers(son(callers),sp,&sizecallers);
3302
      }
3297
      }
3303
      else {
3298
      else {
3304
	sizecallers = 0;
3299
	sizecallers = 0;
3305
      }
3300
      }
3306
 
3301
 
3307
      if((in_vcallers_apply = call_has_vcallers(cllees))) {
3302
      if ((in_vcallers_apply = call_has_vcallers(cllees))) {
3308
	sizecallers = 12 * REG_SIZE;
3303
	sizecallers = 12 * REG_SIZE;
3309
      }
3304
      }
3310
      else {
3305
      else {
3311
	sizecallers = 6 * REG_SIZE;
3306
	sizecallers = 6 * REG_SIZE;
3312
      }
3307
      }
3313
	
3308
 
3314
      (void)make_code(cllees,nsp,nowhere,0);
3309
     (void)make_code(cllees,nsp,nowhere,0);
3315
      if(name(fn) == name_tag && name(son(fn)) == ident_tag &&
3310
      if (name(fn) == name_tag && name(son(fn)) == ident_tag &&
3316
	 (son(son(fn)) == nilexp || name(son(son(fn))) == proc_tag ||
3311
	(son(son(fn)) == nilexp || name(son(son(fn))) == proc_tag ||
3317
	  name(son(son(fn))) == general_proc_tag)){
3312
	  name(son(son(fn))) == general_proc_tag)) {
3318
	baseoff a;
3313
	baseoff a;
3319
	a.base = RA;
3314
	a.base = RA;
3320
	a.offset = 0;
3315
	a.offset = 0;
3321
	integer_jump_external(i_jsr,26,boff(son(fn)));
3316
	integer_jump_external(i_jsr,26,boff(son(fn)));
3322
	load_store(i_ldgp,GP,a);
3317
	load_store(i_ldgp,GP,a);
3323
      }
3318
      }
3324
      else{
3319
      else{
3325
	if (Has_fp) {
3320
	if (Has_fp) {
3326
	  baseoff b;
3321
	  baseoff b;
3327
	  b.base = FP;
3322
	  b.base = FP;
3328
	  b.offset = (frame_size+callee_size)>>3;
3323
	  b.offset = (frame_size+callee_size) >>3;
3329
	  b.offset = -8;
3324
	  b.offset = -8;
3330
	}	
3325
	}
3331
	else {
3326
	else {
3332
	  baseoff b;
3327
	  baseoff b;
3333
	  b.base=SP;
3328
	  b.base=SP;
3334
	}	
3329
	}
3335
	integer_jump_fn(i_jmp,31,fn,sp);
3330
	integer_jump_fn(i_jmp,31,fn,sp);
3336
      }
3331
      }
3337
      clear_all();
3332
      clear_all();
3338
      {
3333
      {
3339
	int hda = name(sh(e));
3334
	int hda = name(sh(e));
3340
	ans aa;
3335
	ans aa;
3341
	if (is_floating (hda)) {
3336
	if (is_floating(hda)) {
3342
	  freg frg;
3337
	  freg frg;
3343
	  frg.fr = 0;
3338
	  frg.fr = 0;
3344
	  if(hda != shrealhd)
3339
	  if (hda != shrealhd)
3345
	    frg.type = IEEE_double;
3340
	    frg.type = IEEE_double;
3346
	  else
3341
	  else
3347
	    frg.type = IEEE_single;
3342
	    frg.type = IEEE_single;
3348
	  setfregalt (aa, frg);
3343
	  setfregalt(aa, frg);
3349
	  move (aa,dest, sp, 1);
3344
	  move(aa,dest, sp, 1);
3350
	  /* move floating point result of application 
3345
	  /* move floating point result of application
3351
	     to destination */
3346
	     to destination */
3352
	}
3347
	}
3353
	else {
3348
	else {
3354
	  setregalt (aa, RESULT_REG);
3349
	  setregalt(aa, RESULT_REG);
3355
	  mka.regmove = RESULT_REG;
3350
	  mka.regmove = RESULT_REG;
3356
	  move (aa,dest, sp, 1);
3351
	  move(aa,dest, sp, 1);
3357
	  /* move floating point result of application to destination */
3352
	  /* move floating point result of application to destination */
3358
	}
3353
	}
3359
	/* else struct results are moved by body of proc */
3354
	/* else struct results are moved by body of proc */
3360
      }
3355
      }
3361
      if(in_vcallers_apply) {
3356
      if (in_vcallers_apply) {
3362
	postlude_arg_space = max(max_args,sizecallers);
3357
	postlude_arg_space = max(max_args,sizecallers);
3363
      }
3358
      }
3364
      else {
3359
      else {
3365
	postlude_arg_space = max(max_args,6*PTR_SZ);
3360
	postlude_arg_space = max(max_args,6*PTR_SZ);
3366
      }
3361
      }
3367
            
3362
 
3368
      if(call_is_untidy(cllees)) {
3363
      if (call_is_untidy(cllees)) {
3369
	operate_fmt_immediate(i_subq,SP,postlude_arg_space>>3,SP);
3364
	operate_fmt_immediate(i_subq,SP,postlude_arg_space>>3,SP);
3370
	reset_tos();
3365
	reset_tos();
3371
	Assert(name(bro(cllees)) == top_tag);
3366
	Assert(name(bro(cllees)) == top_tag);
3372
      }
3367
      }
3373
      else if(postlude_has_call(e)){
3368
      else if (postlude_has_call(e)) {
3374
	exp x = son(callers);
3369
	exp x = son(callers);
3375
	postlude_chain p;
3370
	postlude_chain p;
3376
	for(;;) {
3371
	for (;;) {
3377
	  if(name(x) == caller_tag) {
3372
	  if (name(x) == caller_tag) {
3378
	    no(x) += postlude_arg_space;
3373
	    no(x) += postlude_arg_space;
3379
	  }
3374
	  }
3380
	  if(last(x))break;
3375
	  if (last(x))break;
3381
	  x = bro(x);
3376
	  x = bro(x);
3382
	}
3377
	}
3383
	comment("In postlude, with call");
3378
	comment("In postlude, with call");
3384
	/*	operate_fmt_immediate(i_subq,SP,max_args>>3,SP);*/
3379
	/*	operate_fmt_immediate(i_subq,SP,max_args>>3,SP);*/
3385
 
3380
 
Line 3394... Line 3389...
3394
	old_postludes = p.outer;
3389
	old_postludes = p.outer;
3395
	update_plc(old_postludes,-postlude_arg_space);
3390
	update_plc(old_postludes,-postlude_arg_space);
3396
      }
3391
      }
3397
      else {
3392
      else {
3398
	(void)make_code(postlude,sp,nowhere,0);
3393
	(void)make_code(postlude,sp,nowhere,0);
3399
      }
3394
      }
3400
      in_vcallers_apply = 0;
3395
      in_vcallers_apply = 0;
3401
      return mka;
3396
      return mka;
3402
    }
3397
    }
3403
    case caller_name_tag : {
3398
    case caller_name_tag: {
3404
      return mka;
3399
      return mka;
3405
    }
3400
    }
3406
    case make_callee_list_tag : {
3401
    case make_callee_list_tag: {
3407
      int size  = ((no(e)>>3) + 39) & ~7;
3402
      int size  = ((no(e) >>3) + 39) & ~7;
3408
      int alloc_size;
3403
      int alloc_size;
3409
      bool vc = call_has_vcallees(e);
3404
      bool vc = call_has_vcallees(e);
3410
      exp list = son(e);
3405
      exp list = son(e);
3411
      instore is;
3406
      instore is;
3412
      where w;
3407
      where w;
3413
      baseoff b;
3408
      baseoff b;
3414
      int disp=0;
3409
      int disp=0;
3415
      ash ap;
3410
      ash ap;
3416
      exp anc = father(e);
3411
      exp anc = father(e);
3417
      if(call_has_vcallers(e)){
3412
      if (call_has_vcallers(e)) {
3418
	alloc_size = size + (12 * (PTR_SZ>>3));
3413
	alloc_size = size + (12 *(PTR_SZ>>3));
3419
	sizecallers = (12*(PTR_SZ));
3414
	sizecallers = (12*(PTR_SZ));
3420
      }
3415
      }
3421
      else{
3416
      else{
3422
	alloc_size = size + ((name(anc)==tail_call_tag)?(6*PTR_SZ>>3):
3417
	alloc_size = size + ((name(anc) ==tail_call_tag)?(6*PTR_SZ>>3):
3423
			     (sizecallers>>3));
3418
			    (sizecallers>>3));
3424
      }
3419
      }
3425
      b.base = SP;
3420
      b.base = SP;
3426
      operate_fmt_immediate(i_subq,SP,alloc_size,SP);
3421
      operate_fmt_immediate(i_subq,SP,alloc_size,SP);
3427
 
3422
 
3428
      if(name(anc) == tail_call_tag) {
3423
      if (name(anc) == tail_call_tag) {
3429
	/*b.offset = alloc_size - (PTR_SZ>>3) - arg_stack_space;*/
3424
	/*b.offset = alloc_size - (PTR_SZ>>3) - arg_stack_space;*/
3430
	b.offset = alloc_size - (PTR_SZ>>3);
3425
	b.offset = alloc_size - (PTR_SZ>>3);
3431
	load_store(i_stq,FP,b);
3426
	load_store(i_stq,FP,b);
3432
      }
3427
      }
3433
      else {
3428
      else {
3434
	b.offset = alloc_size -(PTR_SZ>>3) - (sizecallers>>3);
3429
	b.offset = alloc_size - (PTR_SZ>>3) - (sizecallers>>3);
3435
	load_store(i_stq,FP,b);
3430
	load_store(i_stq,FP,b);
3436
      }
3431
      }
3437
#if 0      
3432
#if 0
3438
      if(!Has_fp)
3433
      if (!Has_fp)
3439
	operate_fmt_immediate(i_addq,SP,size,FP);
3434
	operate_fmt_immediate(i_addq,SP,size,FP);
3440
#endif
3435
#endif
3441
      update_plc(old_postludes,alloc_size<<3);
3436
      update_plc(old_postludes,alloc_size<<3);
3442
      if(no(e)){
3437
      if (no(e)) {
3443
	int lastpar = 0;
3438
	int lastpar = 0;
3444
	for(;!lastpar;list =  bro(list)){
3439
	for (;!lastpar;list =  bro(list)) {
3445
	  ap = ashof(sh(list));
3440
	  ap = ashof(sh(list));
3446
	  disp = rounder(disp,ap.ashalign);
3441
	  disp = rounder(disp,ap.ashalign);
3447
	  is.b.offset = disp>>3;
3442
	  is.b.offset = disp>>3;
3448
	  is.b.base = SP;
3443
	  is.b.base = SP;
3449
	  is.adval = 1;
3444
	  is.adval = 1;
Line 3455... Line 3450...
3455
	  lastpar = last(list);
3450
	  lastpar = last(list);
3456
	}
3451
	}
3457
      }
3452
      }
3458
      update_plc(old_postludes,-alloc_size<<3);
3453
      update_plc(old_postludes,-alloc_size<<3);
3459
#if 1
3454
#if 1
3460
      if(vc  && (name(anc) == apply_general_tag)){
3455
      if (vc  && (name(anc) == apply_general_tag)) {
3461
	operate_fmt_immediate(i_addq,SP,alloc_size,FP); 
3456
	operate_fmt_immediate(i_addq,SP,alloc_size,FP);
3462
      }
3457
      }
3463
#endif
3458
#endif
3464
      return mka;
3459
      return mka;
3465
    }
3460
    }
3466
 
3461
 
3467
    case same_callees_tag : {
3462
    case same_callees_tag: {
3468
      baseoff b;
3463
      baseoff b;
3469
      bool vc = call_has_vcallees(e);
3464
      bool vc = call_has_vcallees(e);
3470
      space nsp;
3465
      space nsp;
3471
      if(Has_vcallees){
3466
      if (Has_vcallees) {
3472
	int rsize = getreg(sp.fixed);
3467
	int rsize = getreg(sp.fixed);
3473
	int rsrc,rdest;
3468
	int rsrc,rdest;
3474
	int le = new_label();
3469
	int le = new_label();
3475
	int lb = new_label();
3470
	int lb = new_label();
3476
	int tmp;
3471
	int tmp;
Line 3481... Line 3476...
3481
	nsp = guardreg(rsrc,nsp);
3476
	nsp = guardreg(rsrc,nsp);
3482
	rdest = getreg(nsp.fixed);
3477
	rdest = getreg(nsp.fixed);
3483
	nsp = guardreg(rdest,nsp);
3478
	nsp = guardreg(rdest,nsp);
3484
	operate_fmt(i_bis,SP,SP,tmp);
3479
	operate_fmt(i_bis,SP,SP,tmp);
3485
	operate_fmt(i_subq,FP,local_reg,rsize);
3480
	operate_fmt(i_subq,FP,local_reg,rsize);
3486
	if(!Has_no_vcallers && !call_has_vcallers(e)) {
3481
	if (!Has_no_vcallers && !call_has_vcallers(e)) {
3487
	  operate_fmt_immediate(i_subq,rsize,6*PTR_SZ>>3,rsize);
3482
	  operate_fmt_immediate(i_subq,rsize,6*PTR_SZ>>3,rsize);
3488
	}
3483
	}
3489
	
3484
 
3490
	
3485
 
3491
	if((sizecallers>>3)>arg_stack_space) {
3486
	if ((sizecallers>>3) >arg_stack_space) {
3492
	  operate_fmt_immediate(i_addq,rsize,
3487
	  operate_fmt_immediate(i_addq,rsize,
3493
				((sizecallers>>3)-arg_stack_space),rsize);
3488
				((sizecallers>>3) -arg_stack_space),rsize);
3494
	}
3489
	}
3495
	operate_fmt(i_subq,SP,rsize,SP);
3490
	operate_fmt(i_subq,SP,rsize,SP);
3496
	b.base = tmp;
3491
	b.base = tmp;
3497
	b.offset = -(PTR_SZ>>3) - (sizecallers>>3);
3492
	b.offset = - (PTR_SZ>>3) - (sizecallers>>3);
3498
	load_store(i_stq,FP,b);
3493
	load_store(i_stq,FP,b);
3499
	operate_fmt_immediate(i_subq,FP,4*(PTR_SZ>>3)+(arg_stack_space),
3494
	operate_fmt_immediate(i_subq,FP,4*(PTR_SZ>>3) + (arg_stack_space),
3500
			      rsrc);
3495
			      rsrc);
3501
	operate_fmt_immediate(i_subq,tmp,(4*(PTR_SZ>>3))+(sizecallers>>3),
3496
	operate_fmt_immediate(i_subq,tmp,(4*(PTR_SZ>>3)) + (sizecallers>>3),
3502
			      rdest);
3497
			      rdest);
3503
	
3498
 
3504
	setnoat();
3499
	setnoat();
3505
	operate_fmt(i_cmpeq,rdest,SP,AT);
3500
	operate_fmt(i_cmpeq,rdest,SP,AT);
3506
	integer_branch(i_bne,AT,le);
3501
	integer_branch(i_bne,AT,le);
3507
	setat();
3502
	setat();
3508
	set_label(lb);
3503
	set_label(lb);
3509
	b.base = rsrc;
3504
	b.base = rsrc;
3510
	b.offset = -(PTR_SZ>>3);
3505
	b.offset = - (PTR_SZ>>3);
3511
	load_store(i_ldq,rsize,b);
3506
	load_store(i_ldq,rsize,b);
3512
	b.base = rdest;
3507
	b.base = rdest;
3513
	load_store(i_stq,rsize,b);
3508
	load_store(i_stq,rsize,b);
3514
	operate_fmt_immediate(i_subq,rsrc,PTR_SZ>>3,rsrc);
3509
	operate_fmt_immediate(i_subq,rsrc,PTR_SZ>>3,rsrc);
3515
	operate_fmt_immediate(i_subq,rdest,PTR_SZ>>3,rdest);
3510
	operate_fmt_immediate(i_subq,rdest,PTR_SZ>>3,rdest);
3516
	setnoat();
3511
	setnoat();
3517
	operate_fmt(i_cmpeq,rdest,SP,AT);
3512
	operate_fmt(i_cmpeq,rdest,SP,AT);
3518
	integer_branch(i_beq,AT,lb);
3513
	integer_branch(i_beq,AT,lb);
3519
	setat();
3514
	setat();
3520
	set_label(le);
3515
	set_label(le);
3521
	if(vc) operate_fmt(i_bis,tmp,tmp,FP);
3516
	if (vc)operate_fmt(i_bis,tmp,tmp,FP);
3522
      }
3517
      }
3523
      else{
3518
      else{
3524
	int cs = callee_size>>3;
3519
	int cs = callee_size>>3;
3525
	int i;
3520
	int i;
3526
	int tr = getreg(sp.fixed);
3521
	int tr = getreg(sp.fixed);
3527
	operate_fmt_immediate(i_subq,SP,cs + (sizecallers>>3),SP);
3522
	operate_fmt_immediate(i_subq,SP,cs + (sizecallers>>3),SP);
3528
	b.base = SP;
3523
	b.base = SP;
3529
	b.offset = cs - (PTR_SZ>>3) /*-arg_stack_space*//*-(sizecallers>>3)*/;
3524
	b.offset = cs - (PTR_SZ>>3) /*-arg_stack_space*//*-(sizecallers>>3)*/;
3530
	load_store(i_stq,FP,b);
3525
	load_store(i_stq,FP,b);
3531
	for(i=cs - (4*8);i>0;i -= 8){
3526
	for (i=cs - (4*8);i>0;i -= 8) {
3532
	  b.base = FP;
3527
	  b.base = FP;
3533
	  b.offset = i -cs -8 - (arg_stack_space);
3528
	  b.offset = i -cs -8 - (arg_stack_space);
3534
	  load_store(i_ldq,tr,b);
3529
	  load_store(i_ldq,tr,b);
3535
	  b.base = SP;
3530
	  b.base = SP;
3536
	  b.offset = i - 8;
3531
	  b.offset = i - 8;
3537
	  load_store(i_stq,tr,b);
3532
	  load_store(i_stq,tr,b);
3538
	}
3533
	}
3539
	if(vc) operate_fmt_immediate(i_addq,SP,cs + (sizecallers>>3),FP);
3534
	if (vc)operate_fmt_immediate(i_addq,SP,cs + (sizecallers>>3),FP);
3540
      }
3535
      }
3541
      return mka;
3536
      return mka;
3542
    }
3537
    }
3543
    case make_dynamic_callee_tag : {
3538
    case make_dynamic_callee_tag: {
3544
      bool vc = call_has_vcallees(e);
3539
      bool vc = call_has_vcallees(e);
3545
      exp anc = father(e);
3540
      exp anc = father(e);
3546
      int extra_space;
3541
      int extra_space;
3547
      int rptr,rsize,rdest,tempreg,ls,le;
3542
      int rptr,rsize,rdest,tempreg,ls,le;
3548
      space nsp;
3543
      space nsp;
Line 3556... Line 3551...
3556
      load_reg(bro(son(e)),rsize,sp);
3551
      load_reg(bro(son(e)),rsize,sp);
3557
      nsp = guardreg(rsize,nsp);
3552
      nsp = guardreg(rsize,nsp);
3558
      rdest = getreg(nsp.fixed);
3553
      rdest = getreg(nsp.fixed);
3559
      nsp = guardreg(rdest,nsp);
3554
      nsp = guardreg(rdest,nsp);
3560
      tempreg = getreg(nsp.fixed);
3555
      tempreg = getreg(nsp.fixed);
3561
      operate_fmt_immediate(i_addq,rsize,(4*(PTR_SZ>>3)+extra_space)+7,rdest);
3556
      operate_fmt_immediate(i_addq,rsize,(4*(PTR_SZ>>3) +extra_space) +7,rdest);
3562
      operate_fmt_immediate(i_bic,rdest,7,rdest);
3557
      operate_fmt_immediate(i_bic,rdest,7,rdest);
3563
      b.base = SP;
3558
      b.base = SP;
3564
      b.offset = -(PTR_SZ>>3) - (sizecallers>>3);
3559
      b.offset = - (PTR_SZ>>3) - (sizecallers>>3);
3565
      load_store(i_stq,FP,b);
3560
      load_store(i_stq,FP,b);
3566
      if(vc) operate_fmt(i_bis,SP,SP,FP);
3561
      if (vc)operate_fmt(i_bis,SP,SP,FP);
3567
      operate_fmt(i_subq,SP,rdest,SP);
3562
      operate_fmt(i_subq,SP,rdest,SP);
3568
      operate_fmt(i_bis,SP,SP,rdest);
3563
      operate_fmt(i_bis,SP,SP,rdest);
3569
      ls = new_label();
3564
      ls = new_label();
3570
      le = new_label();
3565
      le = new_label();
3571
      integer_branch(i_ble,rsize,le);
3566
      integer_branch(i_ble,rsize,le);
Line 3581... Line 3576...
3581
      integer_branch(i_bgt,rsize,ls);
3576
      integer_branch(i_bgt,rsize,ls);
3582
      set_label(le);
3577
      set_label(le);
3583
      return mka;
3578
      return mka;
3584
    }
3579
    }
3585
 
3580
 
3586
    case tail_call_tag : {
3581
    case tail_call_tag: {
3587
      exp fn = son(e);
3582
      exp fn = son(e);
3588
      exp cllees = bro(fn);
3583
      exp cllees = bro(fn);
3589
      exp bdy = son(crt_proc);
3584
      exp bdy = son(crt_proc);
3590
      int stack_space;
3585
      int stack_space;
3591
      int rsize = -1;
3586
      int rsize = -1;
3592
      space nsp;
3587
      space nsp;
3593
      nsp = sp;
3588
      nsp = sp;
3594
      stack_space = max(arg_stack_space,6*(PTR_SZ>>3));
3589
      stack_space = max(arg_stack_space,6*(PTR_SZ>>3));
3595
      
3590
 
3596
      if(name(cllees) == make_callee_list_tag){
3591
      if (name(cllees) == make_callee_list_tag) {
3597
	code_here(cllees,sp,nowhere);
3592
	code_here(cllees,sp,nowhere);
3598
      }
3593
      }
3599
      for(;name(bdy)==dump_tag || name(bdy)==diagnose_tag;bdy = son(bdy));
3594
      for (;name(bdy) ==dump_tag || name(bdy) ==diagnose_tag;bdy = son(bdy));
3600
 
3595
 
3601
      while(name(bdy) == ident_tag && isparam(bdy)) {
3596
      while (name(bdy) == ident_tag && isparam(bdy)) {
3602
	/* go throught the current callers, making sure they are 
3597
	/* go throught the current callers, making sure they are
3603
	   in the right place */
3598
	   in the right place */
3604
	exp sbody = son(bdy);
3599
	exp sbody = son(bdy);
3605
	baseoff b;
3600
	baseoff b;
3606
	if(Has_fp) {
3601
	if (Has_fp) {
3607
	  b.base = FP;
3602
	  b.base = FP;
3608
	  b.offset = (no(sbody)>>3) - stack_space;
3603
	  b.offset = (no(sbody) >>3) - stack_space;
3609
	}
3604
	}
3610
	else {
3605
	else {
3611
	  b.base = SP;
3606
	  b.base = SP;
3612
	  b.offset = (no(sbody) + frame_size + callee_size)>>3;
3607
	  b.offset = (no(sbody) + frame_size + callee_size) >>3;
3613
	}
3608
	}
3614
#if 0	
3609
#if 0
3615
 
3610
 
3616
 
3611
 
3617
	b.base = FP;
3612
	b.base = FP;
3618
	b.offset = (no(sbody)>>3) - (PTR_SZ>>3)  ;  /* This will work its 
3613
	b.offset = (no(sbody)>>3) - (PTR_SZ>>3)  ;  /* This will work its
3619
						       way through the 
3614
						       way through the
3620
						       caller param area */
3615
						       caller param area */
3621
	b.offset = no(sbody)>>3;
3616
	b.offset = no(sbody) >>3;
3622
#endif
3617
#endif
3623
 
3618
 
3624
	if(name(sbody) == formal_callee_tag) {
3619
	if (name(sbody) == formal_callee_tag) {
3625
	  if((props(bdy) & inanyreg)) {
3620
	  if ((props(bdy) & inanyreg)) {
3626
	    b.offset -= callee_size>>3;
3621
	    b.offset -= callee_size>>3;
3627
	    if(isvar(bdy)) {
3622
	    if (isvar(bdy)) {
3628
	      if(is_floating(name(sh(sbody)))) {
3623
	      if (is_floating(name(sh(sbody)))) {
3629
		float_load_store((name(sh(sbody)) == shrealhd)?i_sts : i_stt,
3624
		float_load_store((name(sh(sbody)) == shrealhd)?i_sts : i_stt,
3630
				 no(bdy),b);
3625
				 no(bdy),b);
3631
	      }
3626
	      }
3632
	      else {
3627
	      else {
3633
		load_store(is64(sh(sbody))?i_stq : i_stl,no(bdy),b);
3628
		load_store(is64(sh(sbody))?i_stq : i_stl,no(bdy),b);
3634
	      }
3629
	      }
3635
	    }
3630
	    }
3636
	  }
3631
	  }
3637
	}
3632
	}
3638
	else if(props(sbody)==0 && (props(bdy)&inanyreg)!=0){
3633
	else if (props(sbody) ==0 && (props(bdy) &inanyreg)!=0) {
3639
	  /* move from reg to store */
3634
	  /* move from reg to store */
3640
	  if(isvar(bdy)){
3635
	  if (isvar(bdy)) {
3641
	    if(is_floating(name(sh(sbody)))){
3636
	    if (is_floating(name(sh(sbody)))) {
3642
	      float_load_store((name(sh(sbody))==shrealhd)?i_sts:i_stt,
3637
	      float_load_store((name(sh(sbody)) ==shrealhd)?i_sts:i_stt,
3643
			       no(bdy),b);
3638
			       no(bdy),b);
3644
	    }
3639
	    }
3645
	    else{
3640
	    else{
3646
	      load_store(is64(sh(sbody))?i_stq:i_stl,props(sbody),b);
3641
	      load_store(is64(sh(sbody))?i_stq:i_stl,props(sbody),b);
3647
	    }
3642
	    }
3648
	  }
3643
	  }
3649
	}
3644
	}
3650
	else if(props(sbody)!= 0 && (props(bdy) & inanyreg)==0){
3645
	else if (props(sbody)!= 0 && (props(bdy) & inanyreg) ==0) {
3651
	  /* move from store to reg */
3646
	  /* move from store to reg */
3652
	  if(is_floating(name(sh(sbody)))){
3647
	  if (is_floating(name(sh(sbody)))) {
3653
	    float_load_store((name(sh(sbody))==shrealhd)?i_lds:i_ldt,
3648
	    float_load_store((name(sh(sbody)) ==shrealhd)?i_lds:i_ldt,
3654
			     props(sbody),b);
3649
			     props(sbody),b);
3655
	  }
3650
	  }
3656
	  else{
3651
	  else{
3657
	    if(isvis(bdy) && last_param(bdy) && !Has_no_vcallers) {
3652
	    if (isvis(bdy) && last_param(bdy) && !Has_no_vcallers) {
3658
	      int this_reg = props(sbody);
3653
	      int this_reg = props(sbody);
3659
	      int r;
3654
	      int r;
3660
	      Assert(this_reg>=16);
3655
	      Assert(this_reg>=16);
3661
	      b.offset = ((this_reg+1-16)<<3)+((gpdumpstart - frame_size)>>3);
3656
	      b.offset = ((this_reg+1-16) <<3) + ((gpdumpstart - frame_size) >>3);
3662
	      for(r = this_reg+1;r <= LAST_INT_ARG;++r) {
3657
	      for (r = this_reg+1;r <= LAST_INT_ARG;++r) {
3663
		load_store(i_ldq,r,b);
3658
		load_store(i_ldq,r,b);
3664
		b.offset += (REG_SIZE>>3);
3659
		b.offset += (REG_SIZE>>3);
3665
	      }
3660
	      }
3666
	      b.offset = ((paramsdumpstart-frame_size)>>3);
3661
	      b.offset = ((paramsdumpstart-frame_size) >>3);
3667
	      for(r = FIRST_FLOAT_ARG;r<= LAST_FLOAT_ARG;++r) {
3662
	      for (r = FIRST_FLOAT_ARG;r<= LAST_FLOAT_ARG;++r) {
3668
		float_load_store(i_ldt,r,b);
3663
		float_load_store(i_ldt,r,b);
3669
		b.offset += (REG_SIZE>>3);
3664
		b.offset += (REG_SIZE>>3);
3670
	      }
3665
	      }
3671
	      b.offset = ((this_reg-16)<<3) +((gpdumpstart-frame_size)>>3);
3666
	      b.offset = ((this_reg-16) <<3) + ((gpdumpstart-frame_size) >>3);
3672
	      load_store(is64(sh(sbody))?i_ldq:i_ldl,props(sbody),b);
3667
	      load_store(is64(sh(sbody))?i_ldq:i_ldl,props(sbody),b);
3673
	    }
3668
	    }
3674
	    else {
3669
	    else {
3675
	      load_store(is64(sh(sbody))?i_ldq:i_ldl,props(sbody),b);
3670
	      load_store(is64(sh(sbody))?i_ldq:i_ldl,props(sbody),b);
3676
	    }
3671
	    }
3677
	    
3672
 
3678
	  }
3673
	  }
3679
	}
3674
	}
3680
	else if(props(sbody)!=0 && (props(sbody) != no(bdy))){
3675
	else if (props(sbody)!=0 && (props(sbody)!= no(bdy))) {
3681
	  /* move from reg to reg */
3676
	  /* move from reg to reg */
3682
	  if(is_floating(name(sh(sbody)))){
3677
	  if (is_floating(name(sh(sbody)))) {
3683
	    float_op(i_cpys,no(bdy),no(bdy),props(sbody));
3678
	    float_op(i_cpys,no(bdy),no(bdy),props(sbody));
3684
	  }
3679
	  }
3685
	  else{
3680
	  else{
3686
	    operate_fmt(i_bis,no(bdy),no(bdy),props(sbody));
3681
	    operate_fmt(i_bis,no(bdy),no(bdy),props(sbody));
3687
	  }
3682
	  }
3688
	}
3683
	}
3689
	bdy = bro(sbody);
3684
	bdy = bro(sbody);
3690
      }
3685
      }
3691
      restore_sregs(fixdone,fltdone);
3686
      restore_sregs(fixdone,fltdone);
3692
 
3687
 
3693
      /*
3688
      /*
3694
	Allocate space on the frame for the number of callees used 
3689
	Allocate space on the frame for the number of callees used
3695
	in the tail call which exceed the number of callees for 
3690
	in the tail call which exceed the number of callees for
3696
	this procedure 
3691
	this procedure
3697
	*/
3692
	*/
3698
      if(name(cllees) == make_callee_list_tag){
3693
      if (name(cllees) == make_callee_list_tag) {
3699
	int x = (((no(cllees) >> 3) + 39) & ~7) + stack_space;
3694
	int x = (((no(cllees) >> 3) + 39) & ~7) + stack_space;
3700
	baseoff b;
3695
	baseoff b;
3701
	int i;
3696
	int i;
3702
	int rndcllees = ((no(cllees)>>3)+7)&~7;
3697
	int rndcllees = ((no(cllees) >>3) +7) &~7;
3703
	setnoat();
3698
	setnoat();
3704
	for(i=no(cllees)>>3;i>0;i -= (PTR_SZ>>3)){
3699
	for (i=no(cllees) >>3;i>0;i -= (PTR_SZ>>3)) {
3705
	  b.base = SP;
3700
	  b.base = SP;
3706
	  b.offset = i - (PTR_SZ>>3);
3701
	  b.offset = i - (PTR_SZ>>3);
3707
	  load_store(i_ldq,AT,b);
3702
	  load_store(i_ldq,AT,b);
3708
	  b.base = FP;
3703
	  b.base = FP;
3709
	  b.offset = i-(4*(PTR_SZ>>3)) - (rndcllees + (PTR_SZ>>3)) 
3704
	  b.offset = i- (4*(PTR_SZ>>3)) - (rndcllees + (PTR_SZ>>3))
3710
	    - stack_space;
3705
	    - stack_space;
3711
	  load_store(i_stq,AT,b);
3706
	  load_store(i_stq,AT,b);
3712
	}
3707
	}
3713
	setat();
3708
	setat();
3714
	operate_fmt_immediate(i_subq,FP,x,SP);
3709
	operate_fmt_immediate(i_subq,FP,x,SP);
3715
      }
3710
      }
3716
      else if(name(cllees) == make_dynamic_callee_tag){
3711
      else if (name(cllees) == make_dynamic_callee_tag) {
3717
	int rdest,rsource,tempreg,le,ls;
3712
	int rdest,rsource,tempreg,le,ls;
3718
	space nsp;
3713
	space nsp;
3719
	baseoff b;
3714
	baseoff b;
3720
	rdest = getreg(sp.fixed);
3715
	rdest = getreg(sp.fixed);
3721
	nsp = guardreg(rdest,sp);
3716
	nsp = guardreg(rdest,sp);
Line 3724... Line 3719...
3724
	nsp = guardreg(rsource,nsp);
3719
	nsp = guardreg(rsource,nsp);
3725
	rsize = getreg(nsp.fixed);
3720
	rsize = getreg(nsp.fixed);
3726
	load_reg(bro(son(cllees)),rsize,nsp);
3721
	load_reg(bro(son(cllees)),rsize,nsp);
3727
	nsp = guardreg(rsize,nsp);
3722
	nsp = guardreg(rsize,nsp);
3728
	tempreg = getreg(nsp.fixed);
3723
	tempreg = getreg(nsp.fixed);
3729
	operate_fmt_immediate(i_subq,FP,4*(PTR_SZ>>3)+stack_space,rdest);
3724
	operate_fmt_immediate(i_subq,FP,4*(PTR_SZ>>3) +stack_space,rdest);
3730
	operate_fmt_immediate(i_addq,rsize,7,rsize);
3725
	operate_fmt_immediate(i_addq,rsize,7,rsize);
3731
	operate_fmt_immediate(i_bic,rsize,7,rsize);
3726
	operate_fmt_immediate(i_bic,rsize,7,rsize);
3732
	operate_fmt(i_addq,rsource,rsize,rsource);
3727
	operate_fmt(i_addq,rsource,rsize,rsource);
3733
	le = new_label();
3728
	le = new_label();
3734
	ls = new_label();
3729
	ls = new_label();
3735
	integer_branch(i_ble,rsize,le);
3730
	integer_branch(i_ble,rsize,le);
3736
	set_label(ls);
3731
	set_label(ls);
3737
	b.base = rsource;
3732
	b.base = rsource;
3738
	b.offset = -(PTR_SZ>>3);
3733
	b.offset = - (PTR_SZ>>3);
3739
	load_store(i_ldq,tempreg,b);
3734
	load_store(i_ldq,tempreg,b);
3740
	b.base = rdest;
3735
	b.base = rdest;
3741
	load_store(i_stq,tempreg,b);
3736
	load_store(i_stq,tempreg,b);
3742
	operate_fmt_immediate(i_subq,rdest,(PTR_SZ>>3),rdest);
3737
	operate_fmt_immediate(i_subq,rdest,(PTR_SZ>>3),rdest);
3743
	operate_fmt_immediate(i_subq,rsource,(PTR_SZ>>3),rsource);
3738
	operate_fmt_immediate(i_subq,rsource,(PTR_SZ>>3),rsource);
Line 3745... Line 3740...
3745
	integer_branch(i_bgt,rsize,ls);
3740
	integer_branch(i_bgt,rsize,ls);
3746
	set_label(le);
3741
	set_label(le);
3747
	operate_fmt(i_bis,rdest,rdest,SP);
3742
	operate_fmt(i_bis,rdest,rdest,SP);
3748
      }
3743
      }
3749
      else{
3744
      else{
3750
	if(Has_vcallees){
3745
	if (Has_vcallees) {
3751
	  operate_fmt(i_bis,local_reg,local_reg,SP);
3746
	  operate_fmt(i_bis,local_reg,local_reg,SP);
3752
	}
3747
	}
3753
	else{
3748
	else{
3754
	  operate_fmt_immediate(i_subq,FP,stack_space+(callee_size>>3),SP);
3749
	  operate_fmt_immediate(i_subq,FP,stack_space+ (callee_size>>3),SP);
3755
	}
3750
	}
3756
      }
3751
      }
3757
      if(Has_vcallees){
3752
      if (Has_vcallees) {
3758
	baseoff b;
3753
	baseoff b;
3759
	b.base = FP;
3754
	b.base = FP;
3760
	b.offset = (-4 * (PTR_SZ>>3)) - stack_space;
3755
	b.offset = (-4 *(PTR_SZ>>3)) - stack_space;
3761
	load_store(i_ldq,local_reg,b);
3756
	load_store(i_ldq,local_reg,b);
3762
      }
3757
      }
3763
      
3758
 
3764
      if(!in_general_proc) {
3759
      if (!in_general_proc) {
3765
	baseoff b;
3760
	baseoff b;
3766
	b.base = FP;
3761
	b.base = FP;
3767
	b.offset = -(PTR_SZ>>3)-arg_stack_space;
3762
	b.offset = - (PTR_SZ>>3) -arg_stack_space;
3768
	setnoat();
3763
	setnoat();
3769
	load_store(i_ldq,AT,b);
3764
	load_store(i_ldq,AT,b);
3770
	b.base = SP;
3765
	b.base = SP;
3771
	if(name(cllees)!=make_dynamic_callee_tag) {
3766
	if (name(cllees)!=make_dynamic_callee_tag) {
3772
	  b.offset = (((no(cllees) >> 3) + 39) & ~7)-(PTR_SZ>>3);
3767
	  b.offset = (((no(cllees) >> 3) + 39) & ~7) - (PTR_SZ>>3);
3773
	}
3768
	}
3774
	else {
3769
	else {
3775
	  load_reg(bro(son(cllees)),rsize,sp);
3770
	  load_reg(bro(son(cllees)),rsize,sp);
3776
	  operate_fmt_immediate(i_addq,rsize,7,rsize);
3771
	  operate_fmt_immediate(i_addq,rsize,7,rsize);
3777
	  operate_fmt_immediate(i_bic,rsize,7,rsize);
3772
	  operate_fmt_immediate(i_bic,rsize,7,rsize);
3778
	  operate_fmt_immediate(i_addq,rsize,(39&~7)-(PTR_SZ>>3),rsize);
3773
	  operate_fmt_immediate(i_addq,rsize,(39&~7) - (PTR_SZ>>3),rsize);
3779
	  operate_fmt(i_addq,rsize,SP,rsize);
3774
	  operate_fmt(i_addq,rsize,SP,rsize);
3780
	  b.base = rsize;
3775
	  b.base = rsize;
3781
	  b.offset = 0;
3776
	  b.offset = 0;
3782
	}
3777
	}
3783
	
3778
 
3784
	load_store(i_stq,AT,b);
3779
	load_store(i_stq,AT,b);
3785
	if(Has_vcallees) {
3780
	if (Has_vcallees) {
3786
	  operate_fmt(i_bis,FP,FP,local_reg);
3781
	  operate_fmt(i_bis,FP,FP,local_reg);
3787
	}
3782
	}
3788
      }
3783
      }
3789
      
3784
 
3790
      {
3785
      {
3791
	int rt = getreg(sp.fixed);
3786
	int rt = getreg(sp.fixed);
3792
	rt = reg_operand(fn,guardreg(RA,sp));
3787
	rt = reg_operand(fn,guardreg(RA,sp));
3793
	operate_fmt(i_bis,rt,rt,PV);
3788
	operate_fmt(i_bis,rt,rt,PV);
3794
	integer_jump(i_jmp,31,rt,0);
3789
	integer_jump(i_jmp,31,rt,0);
3795
	/*integer_jump_external(i_jmp,31,boff(son(fn)));*/
3790
	/*integer_jump_external(i_jmp,31,boff(son(fn)));*/
3796
      }
3791
      }
3797
      return mka;
3792
      return mka;
3798
    }
3793
    }
3799
#ifdef return_to_label_tag
3794
#ifdef return_to_label_tag
3800
    case return_to_label_tag : {
3795
    case return_to_label_tag: {
3801
      int r = getreg(sp.fixed);
3796
      int r = getreg(sp.fixed);
3802
      where w;
3797
      where w;
3803
      w.ashwhere.ashsize = 64;
3798
      w.ashwhere.ashsize = 64;
3804
      w.ashwhere.ashalign = 64;
3799
      w.ashwhere.ashalign = 64;
3805
      setregalt(w.answhere,r);
3800
      setregalt(w.answhere,r);
3806
      code_here(son(e),sp,w);
3801
      code_here(son(e),sp,w);
3807
      clear_all();
3802
      clear_all();
3808
      if(Has_fp) {
3803
      if (Has_fp) {
3809
	baseoff b;
3804
	baseoff b;
3810
	b.base = FP;
3805
	b.base = FP;
3811
	restore_sregs(fixdone,fltdone);
3806
	restore_sregs(fixdone,fltdone);
3812
	if(Has_vcallees) {
3807
	if (Has_vcallees) {
3813
	  b.offset = -4*(PTR_SZ>>3);
3808
	  b.offset = -4*(PTR_SZ>>3);
3814
	  load_store(i_ldq,local_reg,b);
3809
	  load_store(i_ldq,local_reg,b);
3815
	}
3810
	}
3816
	b.offset = -(PTR_SZ>>3) - arg_stack_space;
3811
	b.offset = - (PTR_SZ>>3) - arg_stack_space;
3817
	operate_fmt(i_bis,FP,FP,SP);
3812
	operate_fmt(i_bis,FP,FP,SP);
3818
	load_store(i_ldq,FP,b);
3813
	load_store(i_ldq,FP,b);
3819
      }
3814
      }
3820
      else if(frame_size != 0) {
3815
      else if (frame_size != 0) {
3821
	restore_sregs(fixdone,fltdone);
3816
	restore_sregs(fixdone,fltdone);
3822
	operate_fmt_immediate(i_addq,SP,frame_size>>3,SP);
3817
	operate_fmt_immediate(i_addq,SP,frame_size>>3,SP);
3823
      }
3818
      }
3824
      integer_jump(i_jmp,31,r,0);
3819
      integer_jump(i_jmp,31,r,0);
3825
      clear_all();
3820
      clear_all();
3826
      return mka;
3821
      return mka;
3827
    }
3822
    }
3828
#endif    
3823
#endif
3829
 
3824
 
3830
    case untidy_return_tag :
3825
    case untidy_return_tag:
3831
    case res_tag : {
3826
    case res_tag: {
3832
      where w;
3827
      where w;
3833
      w.answhere = procans;
3828
      w.answhere = procans;
3834
      w.ashwhere = ashof (sh (son (e)));
3829
      w.ashwhere = ashof(sh(son(e)));
3835
      code_here (son (e), sp, w);
3830
      code_here(son(e), sp, w);
3836
      /* evaluate result value */
3831
      /* evaluate result value */
3837
      if(name(e) == untidy_return_tag) comment("untidy return");
3832
      if (name(e) == untidy_return_tag)comment("untidy return");
3838
      
3833
 
3839
      clear_all ();		/* clear all register memories */
3834
      clear_all ();		/* clear all register memories */
3840
      if (rscope_level == 0) {/* normal proc body */
3835
      if (rscope_level == 0) {/* normal proc body */
3841
	if (name(son(e)) == apply_tag && props(e)) return mka;
3836
	if (name(son(e)) == apply_tag && props(e)) return mka;
3842
	/* was a tail recursion */
3837
	/* was a tail recursion */
3843
	if (frame_size == 0 && !Has_fp) {
3838
	if (frame_size == 0 && !Has_fp) {
Line 3846... Line 3841...
3846
	if (result_label != 0) {
3841
	if (result_label != 0) {
3847
	  integer_branch(i_br,31,result_label);
3842
	  integer_branch(i_br,31,result_label);
3848
	  comment(" Return ");
3843
	  comment(" Return ");
3849
	}
3844
	}
3850
	else{
3845
	else{
3851
	  if ((fixdone|fltdone)==0) {
3846
	  if ((fixdone|fltdone) ==0) {
3852
	    result_label = new_label();
3847
	    result_label = new_label();
3853
	    set_label(result_label);
3848
	    set_label(result_label);
3854
	  }
3849
	  }
3855
	  if (Has_fp) {
3850
	  if (Has_fp) {
3856
	    baseoff b;
3851
	    baseoff b;
3857
	    b.base = FP;
3852
	    b.base = FP;
3858
	    restore_sregs (fixdone, fltdone);
3853
	    restore_sregs(fixdone, fltdone);
3859
	    if(Has_vcallees){
3854
	    if (Has_vcallees) {
3860
	      b.offset = -4 * (PTR_SZ>>3) - arg_stack_space;
3855
	      b.offset = -4 *(PTR_SZ>>3) - arg_stack_space;
3861
	      load_store(i_ldq,local_reg,b);
3856
	      load_store(i_ldq,local_reg,b);
3862
	    }
3857
	    }
3863
	    b.offset = (in_general_proc)?(-PTR_SZ>>3):(-arg_stack_space-(PTR_SZ>>3));;
3858
	    b.offset = (in_general_proc)?(-PTR_SZ>>3):(-arg_stack_space- (PTR_SZ>>3));;
3864
	    b.offset = (-arg_stack_space-(PTR_SZ>>3));;
3859
	    b.offset = (-arg_stack_space- (PTR_SZ>>3));;
3865
#if 0
3860
#if 0
3866
	    if(arg_stack_space && in_general_proc && name(e) == res_tag){
3861
	    if (arg_stack_space && in_general_proc && name(e) == res_tag) {
3867
	      operate_fmt_immediate(i_addq,FP,arg_stack_space,SP);
3862
	      operate_fmt_immediate(i_addq,FP,arg_stack_space,SP);
3868
	    }
3863
	    }
3869
 
3864
 
3870
	    else 
3865
	    else
3871
#endif
3866
#endif
3872
	      if (name(e) == res_tag){
3867
	      if (name(e) == res_tag) {
3873
		operate_fmt(i_bis,FP,FP,SP);
3868
		operate_fmt(i_bis,FP,FP,SP);
3874
	    }
3869
	    }
3875
	    load_store(i_ldq,FP,b);
3870
	    load_store(i_ldq,FP,b);
3876
	  }
3871
	  }
3877
	  else {		
3872
	  else {
3878
	    baseoff a;
3873
	    baseoff a;
3879
	    restore_sregs (fixdone, fltdone);
3874
	    restore_sregs(fixdone, fltdone);
3880
	    /* restore dumped value of s-regs on entry */
3875
	    /* restore dumped value of s-regs on entry */
3881
	    a.base=SP;
3876
	    a.base=SP;
3882
	    a.offset=(callee_size+frame_size)>>3;
3877
	    a.offset= (callee_size+frame_size) >>3;
3883
	    if(a.offset!=0 && name(e) == res_tag)
3878
	    if (a.offset!=0 && name(e) == res_tag)
3884
	      load_store(i_lda,SP,a);
3879
	      load_store(i_lda,SP,a);
3885
	    /* reset stack ptr */
3880
	    /* reset stack ptr */
3886
	  }
3881
	  }
3887
	  integer_jump(i_ret,31,RA,1);
3882
	  integer_jump(i_ret,31,RA,1);
3888
	}
3883
	}
3889
      }
3884
      }
3890
      else {			/* inlined result */
3885
      else {			/* inlined result */
3891
	if (rscope_label == 0) rscope_label = new_label();
3886
	if (rscope_label == 0)rscope_label = new_label();
3892
	if (rscope_label != exitlab) {
3887
	if (rscope_label != exitlab) {
3893
	  integer_branch(i_br,31,rscope_label);
3888
	  integer_branch(i_br,31,rscope_label);
3894
	  /*
3889
	  /*
3895
	    uncond_ins (i_b, rscope_label);*/
3890
	    uncond_ins (i_b, rscope_label);*/
3896
	}
3891
	}
3897
      }
3892
      }
3898
      sizecallers = 0;
3893
      sizecallers = 0;
3899
      return mka;
3894
      return mka;
3900
    }				/* end result */
3895
    }				/* end result */
3901
 
3896
 
3902
    case diagnose_tag : {
3897
    case diagnose_tag: {
3903
      output_diag(dno(e),0,e);
3898
      output_diag(dno(e),0,e);
3904
/*      output_symbolic_diagnostic(as_file,dno(e));*/
3899
/*      output_symbolic_diagnostic(as_file,dno(e));*/
3905
      mka = make_code (son (e), sp, dest, exitlab);
3900
      mka = make_code(son(e), sp, dest, exitlab);
3906
      output_end_scope(dno(e),e);
3901
      output_end_scope(dno(e),e);
3907
      return mka;
3902
      return mka;
3908
    }
3903
    }
3909
    case solve_tag : {
3904
    case solve_tag: {
3910
      exp m = bro (son (e));
3905
      exp m = bro(son(e));
3911
      int   l = exitlab;
3906
      int   l = exitlab;
3912
      if (dest.answhere.discrim == insomereg) {
3907
      if (dest.answhere.discrim == insomereg) {
3913
	/* choose register for result */
3908
	/* choose register for result */
3914
	int  *sr = someregalt (dest.answhere);
3909
	int  *sr = someregalt(dest.answhere);
3915
	if (*sr != -1) {
3910
	if (*sr != -1) {
3916
	  failer ("Somereg *2");
3911
	  failer("Somereg *2");
3917
	}	
3912
	}
3918
	*sr = getreg (sp.fixed);
3913
	*sr = getreg(sp.fixed);
3919
	setregalt (dest.answhere, *sr);
3914
	setregalt(dest.answhere, *sr);
3920
      }
3915
      }
3921
      else if (dest.answhere.discrim == insomefreg ){
3916
      else if (dest.answhere.discrim == insomefreg) {
3922
	somefreg sfr;
3917
	somefreg sfr;
3923
	freg fr;
3918
	freg fr;
3924
	sfr = somefregalt(dest.answhere);
3919
	sfr = somefregalt(dest.answhere);
3925
	if (*sfr.fr != -1) { failer ("Somefreg *2"); }
3920
	if (*sfr.fr != -1) { failer("Somefreg *2"); }
3926
	*sfr.fr = getfreg(sp.flt);
3921
	*sfr.fr = getfreg(sp.flt);
3927
	fr.fr = *sfr.fr;
3922
	fr.fr = *sfr.fr;
3928
	fr.type = sfr.type;
3923
	fr.type = sfr.type;
3929
	setfregalt(dest.answhere, fr);
3924
	setfregalt(dest.answhere, fr);
3930
      }
3925
      }
3931
 
3926
 
3932
      for (;;) {		/* set up all the labels in the component
3927
      for (;;) {		/* set up all the labels in the component
3933
				   labst_tags */
3928
				   labst_tags */
3934
	no (son (m)) = new_label ();
3929
	no(son(m)) = new_label();
3935
	if (last (m))
3930
	if (last(m))
3936
	  break;
3931
	  break;
3937
	m = bro (m);
3932
	m = bro(m);
3938
      }
3933
      }
3939
 
3934
 
3940
      m = son (e);
3935
      m = son(e);
3941
      for (;;) {		/* evaluate all the component statements 
3936
      for (;;) {		/* evaluate all the component statements
3942
				 */
3937
				 */
3943
	int   fl = make_code (m, sp, dest, l).lab;
3938
	int   fl = make_code(m, sp, dest, l).lab;
3944
	clear_all ();
3939
	clear_all();
3945
	if (fl != 0)
3940
	if (fl != 0)
3946
	  l = fl;
3941
	  l = fl;
3947
	if (!last (m)) {	/* jump to end of solve */
3942
	if (!last (m)) {	/* jump to end of solve */
3948
	  if (l == 0)
3943
	  if (l == 0)
3949
	    l = new_label ();
3944
	    l = new_label();
3950
	  if (name (sh (m)) != bothd) {
3945
	  if (name(sh(m))!= bothd) {
3951
	    integer_branch(i_br,31,l);
3946
	    integer_branch(i_br,31,l);
3952
	  }
3947
	  }
3953
	}
3948
	}
3954
	if (last (m)) {
3949
	if (last(m)) {
3955
	  mka.lab = l;
3950
	  mka.lab = l;
3956
	  return mka;
3951
	  return mka;
3957
	}
3952
	}
3958
	m = bro (m);
3953
	m = bro(m);
3959
      }
3954
      }
3960
    }				/* end solve */
3955
    }				/* end solve */
3961
 
3956
 
3962
      /*
3957
      /*
3963
	case_tag now uses the INT64 type.
3958
	case_tag now uses the INT64 type.
3964
	*/
3959
	*/
3965
    case case_tag : {
3960
    case case_tag: {
3966
      char * outline = (char*)NULL;
3961
      char * outline = (char*)NULL;
3967
      int   r = reg_operand (son (e), sp);
3962
      int   r = reg_operand(son(e), sp);
3968
      /* evaluate controlling integer into reg r */
3963
      /* evaluate controlling integer into reg r */
3969
      mm lims;
3964
      mm lims;
3970
      exp z = bro (son (e));
3965
      exp z = bro(son(e));
3971
      exp zt = z;
3966
      exp zt = z;
3972
      INT64  n;
3967
      INT64  n;
3973
      INT64  l;
3968
      INT64  l;
3974
      INT64  u;
3969
      INT64  u;
3975
      INT64 xt,yt;
3970
      INT64 xt,yt;
3976
      int control_sgned = is_signed(sh(son(e)));
3971
      int control_sgned = is_signed(sh(son(e)));
3977
      u = make_INT64(0x80000000,0x00000000);
3972
      u = make_INT64(0x80000000,0x00000000);
3978
      /*INT64_assign(u,smin);*/
3973
      /*INT64_assign(u,smin);*/
3979
      comment(" begin case ");
3974
      comment(" begin case ");
3980
      INT64_assign(l,exp_to_INT64(zt));
3975
      INT64_assign(l,exp_to_INT64(zt));
3981
      for(n=make_INT64(0,1);;n=INT64_increment(n)){
3976
      for (n=make_INT64(0,1);;n=INT64_increment(n)) {
3982
	/* calculate crude criterion for using
3977
	/* calculate crude criterion for using
3983
	   jump vector or branches */
3978
	   jump vector or branches */
3984
	if(!(INT64_eq(INT64_increment(u),exp_to_INT64(zt))) &&
3979
	if (!(INT64_eq(INT64_increment(u),exp_to_INT64(zt))) &&
3985
	   (son(zt)!=nilexp)){
3980
	  (son(zt)!=nilexp)) {
3986
	  n = INT64_increment(n);
3981
	  n = INT64_increment(n);
3987
	}
3982
	}
3988
	if (last (zt)) {
3983
	if (last(zt)) {
3989
	  u = (son (zt) != nilexp) ? exp_to_INT64(son (zt)):exp_to_INT64(zt);
3984
	  u = (son(zt)!= nilexp)? exp_to_INT64(son(zt)):exp_to_INT64(zt);
3990
	  break;
3985
	  break;
3991
	}
3986
	}
3992
	if (son (zt) != nilexp) {
3987
	if (son(zt)!= nilexp) {
3993
	  u = exp_to_INT64(son (zt));
3988
	  u = exp_to_INT64(son(zt));
3994
	}
3989
	}
3995
	else {
3990
	else {
3996
	  if(INT64_eq(INT64_increment(u),exp_to_INT64(zt))){
3991
	  if (INT64_eq(INT64_increment(u),exp_to_INT64(zt))) {
3997
	    u = INT64_increment(u);
3992
	    u = INT64_increment(u);
3998
	  }
3993
	  }
3999
	}
3994
	}
4000
 
3995
 
4001
	zt = bro (zt);
3996
	zt = bro(zt);
4002
      }
3997
      }
4003
 
3998
 
4004
      /* now l is lowest controlling value and u is highest */
3999
      /* now l is lowest controlling value and u is highest */
4005
      /*	 The above actually means: */
4000
      /*	 The above actually means: */
4006
      if(control_sgned){
4001
      if (control_sgned) {
4007
	xt = (INT64_subtract(INT64_shift_right(u,1,1),
4002
	xt = (INT64_subtract(INT64_shift_right(u,1,1),
4008
			     INT64_shift_right(l,1,1),1));
4003
			     INT64_shift_right(l,1,1),1));
4009
	yt = (INT64_subtract(INT64_divide(INT64_mult(n,n,1),
4004
	yt = (INT64_subtract(INT64_divide(INT64_mult(n,n,1),
4010
					  make_INT64(0,4),1),
4005
					  make_INT64(0,4),1),
4011
			     make_INT64(0,3),1));
4006
			     make_INT64(0,3),1));
4012
      }
4007
      }
4013
      else {
4008
      else {
4014
	unsigned long uu = unsigned_rep (u,sh(son(e)));
4009
	unsigned long uu = unsigned_rep(u,sh(son(e)));
4015
	unsigned long lu = unsigned_rep (l,sh(son(e)));
4010
	unsigned long lu = unsigned_rep(l,sh(son(e)));
4016
	xt = (INT64_subtract(INT64_shift_right(uu,1,1),
4011
	xt = (INT64_subtract(INT64_shift_right(uu,1,1),
4017
			     INT64_shift_right(lu,1,1),1));
4012
			     INT64_shift_right(lu,1,1),1));
4018
	yt = (INT64_subtract(INT64_divide(INT64_mult(n,n,1),
4013
	yt = (INT64_subtract(INT64_divide(INT64_mult(n,n,1),
4019
					  make_INT64(0,4),1),
4014
					  make_INT64(0,4),1),
4020
			     make_INT64(0,3),1));
4015
			     make_INT64(0,3),1));
4021
      }
4016
      }
4022
      
4017
 
4023
      
4018
 
4024
       if( xt <= yt) {
4019
       if (xt <= yt) {
4025
	/* space-time product criterion for jump vector instead 
4020
	/* space-time product criterion for jump vector instead
4026
	   of tests  and branches */
4021
	   of tests  and branches */
4027
	/* use jump vector */
4022
	/* use jump vector */
4028
	int   endlab = new_label ();
4023
	int   endlab = new_label();
4029
	int   veclab = next_dlab_sym ();
4024
	int   veclab = next_dlab_sym();
4030
	baseoff zeroveclab;
4025
	baseoff zeroveclab;
4031
	baseoff zero3;
4026
	baseoff zero3;
4032
	int  rtmp=getreg(guardreg(r,sp).fixed); /* could use AT */
4027
	int  rtmp=getreg(guardreg(r,sp).fixed); /* could use AT */
4033
 
4028
 
4034
 
4029
 
Line 4037... Line 4032...
4037
	zero3.offset = 0;
4032
	zero3.offset = 0;
4038
	zeroveclab.offset = 0;
4033
	zeroveclab.offset = 0;
4039
	zeroveclab.base = veclab;
4034
	zeroveclab.base = veclab;
4040
	n = l;
4035
	n = l;
4041
	start_new_capsule(false);
4036
	start_new_capsule(false);
4042
	if (as_file){
4037
	if (as_file) {
4043
#if !DO_SCHEDULE
4038
#if !DO_SCHEDULE
4044
	  fprintf (as_file, "\t.rdata\n$$%d:\n", veclab);
4039
	  fprintf(as_file, "\t.rdata\n$$%d:\n", veclab);
4045
#else
4040
#else
4046
	  outline = (char*)xcalloc(30,sizeof(char));
4041
	  outline = (char*)xcalloc(30,sizeof(char));
4047
	  sprintf (outline, "\t.rdata\n$$%d:\n", veclab);
4042
	  sprintf(outline, "\t.rdata\n$$%d:\n", veclab);
4048
#endif
4043
#endif
4049
	}
4044
	}
4050
#if DO_SCHEDULE
4045
#if DO_SCHEDULE
4051
	output_instruction(class_null,outline,out_common(0,irdata));
4046
	output_instruction(class_null,outline,out_common(0,irdata));
4052
	output_instruction(class_null,(char*)NULL,
4047
	output_instruction(class_null,(char*)NULL,
4053
			   out_common(tempsnos[veclab-32],ilabel));
4048
			   out_common(tempsnos[veclab-32],ilabel));
4054
#else
4049
#else
4055
	out_common (0, irdata);
4050
	out_common(0, irdata);
4056
	out_common (tempsnos[veclab - 32], ilabel);
4051
	out_common(tempsnos[veclab - 32], ilabel);
4057
#endif
4052
#endif
4058
	for (;;) {
4053
	for (;;) {
4059
	  for (; INT64_lt(n,exp_to_INT64(z)); 
4054
	  for (; INT64_lt(n,exp_to_INT64(z));
4060
		 n = INT64_increment(n)){
4055
		 n = INT64_increment(n)) {
4061
	    /* o/p jump vector */
4056
	    /* o/p jump vector */
4062
	    if (as_file){
4057
	    if (as_file) {
4063
#if !DO_SCHEDULE
4058
#if !DO_SCHEDULE
4064
	      fprintf (as_file, "\t.gprel32\t$%d\n", endlab);
4059
	      fprintf(as_file, "\t.gprel32\t$%d\n", endlab);
4065
#else
4060
#else
4066
	      outline = (char*)xcalloc(30,sizeof(char));
4061
	      outline = (char*)xcalloc(30,sizeof(char));
4067
	      sprintf (outline, "\t.gprel32\t$%d\n", endlab);
4062
	      sprintf(outline, "\t.gprel32\t$%d\n", endlab);
4068
#endif
4063
#endif
4069
	    }
4064
	    }
4070
#if DO_SCHEDULE
4065
#if DO_SCHEDULE
4071
	    output_instruction(class_null,outline,
4066
	    output_instruction(class_null,outline,
4072
			       out_value(-endlab,igprel32,0,1));
4067
			       out_value(-endlab,igprel32,0,1));
4073
#else	     
4068
#else
4074
	    out_value (-endlab, igprel32, make_INT64(0,0), 1);
4069
	    out_value(-endlab, igprel32, make_INT64(0,0), 1);
4075
#endif
4070
#endif
4076
	  }
4071
	  }
4077
	  u = (son (z) == nilexp) ? n : exp_to_INT64(son (z));
4072
	  u = (son(z) == nilexp)? n : exp_to_INT64(son(z));
4078
	  for (; INT64_leq(n,u) /*n <= u*/; n=INT64_increment(n)/*n++*/){
4073
	  for (; INT64_leq(n,u) /*n <= u*/; n=INT64_increment(n)/*n++*/){
4079
	    if (as_file){
4074
	    if (as_file) {
4080
#if !DO_SCHEDULE
4075
#if !DO_SCHEDULE
4081
	      fprintf (as_file, "\t.gprel32\t$%d\n", no (son (pt (z))));
4076
	      fprintf(as_file, "\t.gprel32\t$%d\n", no(son(pt(z))));
4082
#else
4077
#else
4083
	      outline = (char*)xcalloc(30,sizeof(char));
4078
	      outline = (char*)xcalloc(30,sizeof(char));
4084
	      sprintf (outline, "\t.gprel32\t$%d\n", no (son (pt (z))));
4079
	      sprintf(outline, "\t.gprel32\t$%d\n", no(son(pt(z))));
4085
#endif
4080
#endif
4086
	    }
4081
	    }
4087
#if DO_SCHEDULE
4082
#if DO_SCHEDULE
4088
	    output_instruction(class_null,outline,
4083
	    output_instruction(class_null,outline,
4089
			       out_value(-no(son(pt(z))),igprel32,0,1));
4084
			       out_value(-no(son(pt(z))),igprel32,0,1));
4090
#else	     
4085
#else
4091
	    out_value(-no(son(pt(z))),igprel32,make_INT64(0,0),1);
4086
	    out_value(-no(son(pt(z))),igprel32,make_INT64(0,0),1);
4092
#endif
4087
#endif
4093
	  }
4088
	  }
4094
	  if (last (z))
4089
	  if (last(z))
4095
	    break;
4090
	    break;
4096
	  z = bro (z);
4091
	  z = bro(z);
4097
	}
4092
	}
4098
	set_text_section();
4093
	set_text_section();
4099
	setnoat();
4094
	setnoat();
4100
	load_store (i_lda, AT, zeroveclab);
4095
	load_store(i_lda, AT, zeroveclab);
4101
	if (!INT64_eq(l,zero_int64) /*l != 0*/) {
4096
	if (!INT64_eq(l,zero_int64) /*l != 0*/) {
4102
	  int rtmp2;
4097
	  int rtmp2;
4103
	  INT64 lit;
4098
	  INT64 lit;
4104
	  space newsp;
4099
	  space newsp;
4105
	  newsp = guardreg(r,sp);
4100
	  newsp = guardreg(r,sp);
4106
	  newsp = guardreg(rtmp,newsp);
4101
	  newsp = guardreg(rtmp,newsp);
4107
	  rtmp2 = getreg(newsp.fixed);
4102
	  rtmp2 = getreg(newsp.fixed);
4108
	  lit=INT64_subtract(make_INT64(0,0),l,1);
4103
	  lit=INT64_subtract(make_INT64(0,0),l,1);
4109
	  operate_fmt_big_immediate (i_addq, r, lit,rtmp);
4104
	  operate_fmt_big_immediate(i_addq, r, lit,rtmp);
4110
	  lit = INT64_increment(INT64_subtract(u,l,1));
4105
	  lit = INT64_increment(INT64_subtract(u,l,1));
4111
	  operate_fmt_big_immediate(i_cmpult,rtmp,lit,rtmp2);
4106
	  operate_fmt_big_immediate(i_cmpult,rtmp,lit,rtmp2);
4112
	  integer_branch(i_beq,rtmp2,endlab);
4107
	  integer_branch(i_beq,rtmp2,endlab);
4113
	  operate_fmt(i_s4addq,rtmp,AT,rtmp);
4108
	  operate_fmt(i_s4addq,rtmp,AT,rtmp);
4114
	}
4109
	}
Line 4118... Line 4113...
4118
	  newsp = guardreg(r,sp);
4113
	  newsp = guardreg(r,sp);
4119
	  newsp = guardreg(rtmp,newsp);
4114
	  newsp = guardreg(rtmp,newsp);
4120
	  rtmp2 = getreg(newsp.fixed);
4115
	  rtmp2 = getreg(newsp.fixed);
4121
	  load_store_immediate(i_ldiq,rtmp2,INT64_increment(u));
4116
	  load_store_immediate(i_ldiq,rtmp2,INT64_increment(u));
4122
 
4117
 
4123
/*	   operate_fmt(i_subq,r,rtmp2,rtmp);	
4118
/*	   operate_fmt(i_subq,r,rtmp2,rtmp);
4124
	   integer_branch(i_bge,rtmp,endlab); */
4119
	   integer_branch(i_bge,rtmp,endlab); */
4125
	  operate_fmt(i_cmpule,rtmp2,r,rtmp);
4120
	  operate_fmt(i_cmpule,rtmp2,r,rtmp);
4126
	  integer_branch(i_bne,rtmp,endlab);
4121
	  integer_branch(i_bne,rtmp,endlab);
4127
	  operate_fmt(i_s4addq,r,AT,rtmp);
4122
	  operate_fmt(i_s4addq,r,AT,rtmp);
4128
	}
4123
	}
4129
	setat();
4124
	setat();
4130
	load_store(i_ldl,rtmp,zero3);
4125
	load_store(i_ldl,rtmp,zero3);
4131
	operate_fmt(i_addq,rtmp,GP,rtmp);
4126
	operate_fmt(i_addq,rtmp,GP,rtmp);
4132
	integer_jump(i_jmp,31,rtmp,endlab); /* endlab is hint */
4127
	integer_jump(i_jmp,31,rtmp,endlab); /* endlab is hint */
4133
	set_label (endlab);
4128
	set_label(endlab);
4134
	close_capsule();
4129
	close_capsule();
4135
	comment(" end case ");
4130
	comment(" end case ");
4136
	return mka;
4131
	return mka;
4137
      }
4132
      }
4138
      else {
4133
      else {
4139
	int   over = 0;	/* use branches - tests are already
4134
	int   over = 0;	/* use branches - tests are already
4140
			   ordered */
4135
			   ordered */
4141
	int rtmp = getreg(guardreg(r,sp).fixed);
4136
	int rtmp = getreg(guardreg(r,sp).fixed);
4142
	bool usw;
4137
	bool usw;
4143
	lims = maxmin (sh (son (e)));
4138
	lims = maxmin(sh(son(e)));
4144
	usw = !is_signed(sh(son(e)));
4139
	usw = !is_signed(sh(son(e)));
4145
	for (;;) {
4140
	for (;;) {
4146
	  int lab = no(son(pt(z))); /* can this be big */
4141
	  int lab = no(son(pt(z))); /* can this be big */
4147
	  l = exp_to_INT64(z);
4142
	  l = exp_to_INT64(z);
4148
	  if(isbigval(son(pt(z))))
4143
	  if (isbigval(son(pt(z))))
4149
	    alphafail(BIG_LABEL);
4144
	    alphafail(BIG_LABEL);
4150
	  if (son (z) == nilexp) { /* only single test required */
4145
	  if (son (z) == nilexp) { /* only single test required */
4151
	    operate_fmt_big_immediate(i_cmpeq,r,l,rtmp);
4146
	    operate_fmt_big_immediate(i_cmpeq,r,l,rtmp);
4152
	    integer_branch(i_bne,rtmp,lab);
4147
	    integer_branch(i_bne,rtmp,lab);
4153
	    if(INT64_eq(l,lims.maxi)) {
4148
	    if (INT64_eq(l,lims.maxi)) {
4154
	      lims.maxi = INT64_decrement(lims.maxi);
4149
	      lims.maxi = INT64_decrement(lims.maxi);
4155
	    }
4150
	    }
4156
	    else if (INT64_eq(l,lims.mini)) {
4151
	    else if (INT64_eq(l,lims.mini)) {
4157
	      lims.mini = INT64_increment(lims.mini);
4152
	      lims.mini = INT64_increment(lims.mini);
4158
	    }
4153
	    }
4159
	  }
4154
	  }
4160
	  else if (u = exp_to_INT64(son (z)),
4155
	  else if (u = exp_to_INT64(son(z)),
4161
		   INT64_leq(lims.mini,l)||usw) {
4156
		   INT64_leq(lims.mini,l) ||usw) {
4162
/*	       if (INT64_lt(lims.maxi,INT64_and(INT64_not(usw),u))){ */
4157
/*	       if (INT64_lt(lims.maxi,INT64_and(INT64_not(usw),u))){ */
4163
	    if(INT64_leq(lims.maxi,u) && !usw){
4158
	    if (INT64_leq(lims.maxi,u) && !usw) {
4164
	      /* have already tested lower */
4159
	      /* have already tested lower */
4165
	      operate_fmt_big_immediate(i_cmplt,r,l,rtmp);
4160
	      operate_fmt_big_immediate(i_cmplt,r,l,rtmp);
4166
	      integer_branch(i_beq,rtmp,lab);
4161
	      integer_branch(i_beq,rtmp,lab);
4167
	      lims.maxi = INT64_decrement(l);
4162
	      lims.maxi = INT64_decrement(l);
4168
	    }
4163
	    }
4169
	    else {
4164
	    else {
4170
	      if (over == 0) {
4165
	      if (over == 0) {
4171
		over = new_label ();
4166
		over = new_label();
4172
	      }
4167
	      }
4173
	      operate_fmt_big_immediate(i_cmplt,r,l,rtmp);
4168
	      operate_fmt_big_immediate(i_cmplt,r,l,rtmp);
4174
	      integer_branch(i_bne,rtmp,over);
4169
	      integer_branch(i_bne,rtmp,over);
4175
	      operate_fmt_big_immediate(i_cmple,r,u,rtmp);
4170
	      operate_fmt_big_immediate(i_cmple,r,u,rtmp);
4176
	      integer_branch(i_bne,rtmp,lab);
4171
	      integer_branch(i_bne,rtmp,lab);
4177
	      lims.mini = INT64_increment(u);
4172
	      lims.mini = INT64_increment(u);
4178
	    }	
4173
	    }
4179
	  }
4174
	  }
4180
	  else if  (INT64_lt(u,lims.maxi)) {/*lower is <= lower limit 
4175
	  else if  (INT64_lt(u,lims.maxi)) {/*lower is <= lower limit
4181
					      of shape*/
4176
					      of shape*/
4182
	    operate_fmt_big_immediate(i_cmple,r,u,rtmp);
4177
	    operate_fmt_big_immediate(i_cmple,r,u,rtmp);
4183
	    integer_branch(i_bne,rtmp,lab);
4178
	    integer_branch(i_bne,rtmp,lab);
4184
	    lims.mini = INT64_increment(u);
4179
	    lims.mini = INT64_increment(u);
4185
	  }
4180
	  }
4186
	  else {	/* upper is >= upper limit of shape */
4181
	  else {	/* upper is >= upper limit of shape */
4187
	    integer_branch(i_br,31,lab);
4182
	    integer_branch(i_br,31,lab);
4188
	  }
4183
	  }
4189
	  if (last (z)) {
4184
	  if (last(z)) {
4190
	    if (over != 0) {
4185
	    if (over != 0) {
4191
	      set_label (over);
4186
	      set_label(over);
4192
	    } 
4187
	    }
4193
	    comment(" end case ");
4188
	    comment(" end case ");
4194
	    return mka;
4189
	    return mka;
4195
	  }
4190
	  }
4196
	  z = bro (z);
4191
	  z = bro(z);
4197
	}
4192
	}
4198
      }
4193
      }
4199
    } /* end case */
4194
    } /* end case */
4200
 
4195
 
4201
    case plus_tag : 
4196
    case plus_tag:
4202
    case offset_add_tag :{
4197
    case offset_add_tag:{
4203
      if(optop(e)){
4198
      if (optop(e)) {
4204
	mka.regmove = comm_op(e,sp,dest,(dest.ashwhere.ashsize==32)?
4199
	mka.regmove = comm_op(e,sp,dest,(dest.ashwhere.ashsize==32)?
4205
			      i_addl:i_addq);
4200
			      i_addl:i_addq);
4206
	return mka;
4201
	return mka;
4207
      }
4202
      }
4208
#if 0
4203
#if 0
4209
      if(error_treatment_is_trap(e) /*&& is_signed(sh(e))*/){
4204
      if(error_treatment_is_trap(e) /*&& is_signed(sh(e))*/){
4210
	mka.regmove = comm_op(e,sp,dest,(dest.ashwhere.ashsize==32)?
4205
	mka.regmove = comm_op(e,sp,dest,(dest.ashwhere.ashsize==32)?
4211
			      i_addlv:i_addqv);
4206
			      i_addlv:i_addqv);
4212
	return mka;
4207
	return mka;
4213
      }
4208
      }
4214
#endif       
4209
#endif
4215
      else{
4210
      else{
4216
	int r1 = reg_operand(son(e), sp);
4211
	int r1 = reg_operand(son(e), sp);
4217
	int r2,r0;
4212
	int r2,r0;
4218
	int over = new_label();
4213
	int over = new_label();
4219
	int trap = trap_label(e);
4214
	int trap = trap_label(e);
Line 4223... Line 4218...
4223
	r2 = reg_operand(bro(son(e)), nsp);
4218
	r2 = reg_operand(bro(son(e)), nsp);
4224
	nsp = guardreg(r2, nsp);
4219
	nsp = guardreg(r2, nsp);
4225
	r0 = getreg(nsp.fixed);
4220
	r0 = getreg(nsp.fixed);
4226
	nsp = guardreg(r0, nsp);
4221
	nsp = guardreg(r0, nsp);
4227
	operate_fmt(is64(sh(e))?i_addq:i_addl,r1,r2,r0);
4222
	operate_fmt(is64(sh(e))?i_addq:i_addl,r1,r2,r0);
4228
	switch(name(sh(e))){
4223
	switch (name(sh(e))) {
4229
	  case s64hd :
4224
	  case s64hd:
4230
	  case slonghd :{
4225
	  case slonghd:{
4231
	    int r3 = getreg(sp.fixed);
4226
	    int r3 = getreg(sp.fixed);
4232
	    operate_fmt(i_xor,r1,r2,r3);
4227
	    operate_fmt(i_xor,r1,r2,r3);
4233
	    integer_branch(i_blt,r3,over);
4228
	    integer_branch(i_blt,r3,over);
4234
	    operate_fmt(i_xor,r0,r1,r3);
4229
	    operate_fmt(i_xor,r0,r1,r3);
4235
	    if(error_treatment_is_trap(e)){
4230
	    if (error_treatment_is_trap(e)) {
4236
	      integer_branch(i_bge,r3,over);
4231
	      integer_branch(i_bge,r3,over);
4237
	      do_exception(f_overflow);
4232
	      do_exception(f_overflow);
4238
	    }
4233
	    }
4239
	    else{
4234
	    else{
4240
	      integer_branch(i_blt,r3,trap);
4235
	      integer_branch(i_blt,r3,trap);
4241
	    }
4236
	    }
4242
	    set_label(over);
4237
	    set_label(over);
4243
	    break;
4238
	    break;
4244
	  }
4239
	  }
4245
	  case ulonghd :
4240
	  case ulonghd:
4246
	  case u64hd :{
4241
	  case u64hd:{
4247
	    int r3 = getreg(sp.fixed);
4242
	    int r3 = getreg(sp.fixed);
4248
	    operate_fmt(i_cmpult,r0,r1,r3);
4243
	    operate_fmt(i_cmpult,r0,r1,r3);
4249
	    if(error_treatment_is_trap(e)){
4244
	    if (error_treatment_is_trap(e)) {
4250
	      int oklab = new_label();
4245
	      int oklab = new_label();
4251
	      integer_branch(i_beq,r3,oklab);
4246
	      integer_branch(i_beq,r3,oklab);
4252
	      do_exception(f_overflow);
4247
	      do_exception(f_overflow);
4253
	      set_label(oklab);
4248
	      set_label(oklab);
4254
	    }
4249
	    }
4255
	    else{
4250
	    else{
4256
	      integer_branch(i_bne,r3,trap);
4251
	      integer_branch(i_bne,r3,trap);
4257
	    }
4252
	    }
4258
	    break;
4253
	    break;
4259
	  }
4254
	  }
4260
	  case uwordhd :{
4255
	  case uwordhd:{
4261
	    if(error_treatment_is_trap(e)){
4256
	    if (error_treatment_is_trap(e)) {
4262
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4257
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4263
	    }
4258
	    }
4264
	    else{
4259
	    else{
4265
	      test_unsigned(r0,0xffff,trap);
4260
	      test_unsigned(r0,0xffff,trap);
4266
	    }
4261
	    }
4267
	    break;
4262
	    break;
4268
	  }
4263
	  }
4269
	  case swordhd :{
4264
	  case swordhd:{
4270
	    if(error_treatment_is_trap(e)){
4265
	    if (error_treatment_is_trap(e)) {
4271
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4266
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4272
	    }
4267
	    }
4273
	    else{
4268
	    else{
4274
	      test_signed(r0,-0x8000L,0x7fff,trap);
4269
	      test_signed(r0,-0x8000L,0x7fff,trap);
4275
	    }
4270
	    }
4276
	    break;
4271
	    break;
4277
	  }
4272
	  }
4278
	  case ucharhd :{
4273
	  case ucharhd:{
4279
	    if(error_treatment_is_trap(e)){
4274
	    if (error_treatment_is_trap(e)) {
4280
	      test_unsigned_and_trap(r0,255,f_overflow);
4275
	      test_unsigned_and_trap(r0,255,f_overflow);
4281
	    }
4276
	    }
4282
	    else{
4277
	    else{
4283
	      test_unsigned(r0,255,trap);
4278
	      test_unsigned(r0,255,trap);
4284
	    }
4279
	    }
4285
	    break;
4280
	    break;
4286
	  }
4281
	  }
4287
	  case scharhd :{   
4282
	  case scharhd:{
4288
	    if(error_treatment_is_trap(e)){
4283
	    if (error_treatment_is_trap(e)) {
4289
	      test_signed_and_trap(r0,-128,127,f_overflow);
4284
	      test_signed_and_trap(r0,-128,127,f_overflow);
4290
	    }
4285
	    }
4291
	    else{
4286
	    else{
4292
	      test_signed(r0,-128,127,trap);
4287
	      test_signed(r0,-128,127,trap);
4293
	    }
4288
	    }
4294
	    break;
4289
	    break;
4295
	  }
4290
	  }
4296
	  default:failer("illegal shape");
4291
	  default:failer("illegal shape");
4297
	}
4292
	}
4298
	setregalt(aa,r0);
4293
	setregalt(aa,r0);
4299
	mka.regmove = move(aa,dest,nsp,0);
4294
	mka.regmove = move(aa,dest,nsp,0);
4300
	return mka;
4295
	return mka;
4301
      }
4296
      }
4302
    } /* end plus */
4297
    } /* end plus */
4303
 
4298
 
4304
    case chvar_tag : {
4299
    case chvar_tag: {
4305
      int   a;
4300
      int   a;
4306
      int tmpreg;
4301
      int tmpreg;
4307
      int   d;
4302
      int   d;
4308
      ans aa;
4303
      ans aa;
4309
      int   nsh = name (sh (e));
4304
      int   nsh = name(sh(e));
4310
      switch (dest.answhere.discrim) {
4305
      switch (dest.answhere.discrim) {
4311
	case inreg : {
4306
	case inreg: {
4312
	  ash arga;
4307
	  ash arga;
4313
	  arga = ashof (sh (son (e)));
4308
	  arga = ashof(sh(son(e)));
4314
	  if (arga.ashsize <= dest.ashwhere.ashsize) {
4309
	  if (arga.ashsize <= dest.ashwhere.ashsize) {
4315
	    dest.ashwhere = arga;
4310
	    dest.ashwhere = arga;
4316
	  }
4311
	  }
4317
	  a = regalt (dest.answhere);
4312
	  a = regalt(dest.answhere);
4318
	  if (a == NO_REG) {
4313
	  if (a == NO_REG) {
4319
	    a = getreg(sp.fixed);
4314
	    a = getreg(sp.fixed);
4320
	    setregalt(dest.answhere,a);
4315
	    setregalt(dest.answhere,a);
4321
	    dest.ashwhere.ashsize = shape_size(sh(son(e)));
4316
	    dest.ashwhere.ashsize = shape_size(sh(son(e)));
4322
	    dest.ashwhere.ashalign = dest.ashwhere.ashsize;
4317
	    dest.ashwhere.ashalign = dest.ashwhere.ashsize;
4323
	  }
4318
	  }
4324
	  code_here (son (e), sp, dest);
4319
	  code_here(son(e), sp, dest);
4325
	  /* evaluate argument into reg */
4320
	  /* evaluate argument into reg */
4326
	  break;
4321
	  break;
4327
	}
4322
	}
4328
	default: 
4323
	default:
4329
	a = reg_operand (son (e), sp);
4324
	a = reg_operand(son(e), sp);
4330
	/* evaluate arguement into a */
4325
	/* evaluate arguement into a */
4331
      }	
4326
      }
4332
      setregalt (aa, a);
4327
      setregalt(aa, a);
4333
      if(sh(son(e)) == sh(e)){
4328
      if (sh(son(e)) == sh(e)) {
4334
	mka.regmove = move(aa,dest,sp,1);
4329
	mka.regmove = move(aa,dest,sp,1);
4335
	return mka;
4330
	return mka;
4336
      }
4331
      }
4337
 
4332
 
4338
      if((dest.answhere.discrim == inreg) && 
4333
      if ((dest.answhere.discrim == inreg) &&
4339
	 (dest.answhere.val.regans == a)){
4334
	(dest.answhere.val.regans == a)) {
4340
	tmpreg = a;
4335
	tmpreg = a;
4341
      }
4336
      }
4342
      else{
4337
      else{
4343
	tmpreg = getreg(sp.fixed);
4338
	tmpreg = getreg(sp.fixed);
4344
      }
4339
      }
4345
 
4340
 
4346
      if(nsh >= s64hd){
4341
      if (nsh >= s64hd) {
4347
	/* destination is 64 bits wide, the only thing we have 
4342
	/* destination is 64 bits wide, the only thing we have
4348
	   to worry about is the conversion of unsigned 
4343
	   to worry about is the conversion of unsigned
4349
	   values to signed, which can be avoided by the 
4344
	   values to signed, which can be avoided by the
4350
	   following code */
4345
	   following code */
4351
	if(convert_shapes(nsh,name(sh(son(e))),a,tmpreg)){
4346
	if (convert_shapes(nsh,name(sh(son(e))),a,tmpreg)) {
4352
	  setregalt(aa,tmpreg);
4347
	  setregalt(aa,tmpreg);
4353
	}
4348
	}
4354
	mka.regmove = move(aa,dest,sp,1);
4349
	mka.regmove = move(aa,dest,sp,1);
4355
	return mka;
4350
	return mka;
4356
      }
4351
      }
4357
      if (sh (son (e)) == sh (e) /*|| nsh  >= slonghd*/) {
4352
      if (sh (son (e)) == sh (e) /*|| nsh  >= slonghd*/) {
4358
	/* no changes required, so just move to dest*/
4353
	/* no changes required, so just move to dest*/
4359
	    
4354
 
4360
	mka.regmove = move (aa, dest, sp, 1);
4355
	mka.regmove = move(aa, dest, sp, 1);
4361
	return mka;
4356
	return mka;
4362
      }
4357
      }
4363
      switch (dest.answhere.discrim) {
4358
      switch (dest.answhere.discrim) {
4364
	case insomereg : {
4359
	case insomereg: {
4365
	  int  *dr = someregalt (dest.answhere);
4360
	  int  *dr = someregalt(dest.answhere);
4366
	  d = getreg (sp.fixed);
4361
	  d = getreg(sp.fixed);
4367
	  *dr = d;
4362
	  *dr = d;
4368
	  goto out;
4363
	  goto out;
4369
	}
4364
	}
4370
	case inreg : {
4365
	case inreg: {
4371
	  d = regalt (dest.answhere);
4366
	  d = regalt(dest.answhere);
4372
	  goto out;
4367
	  goto out;
4373
	}
4368
	}
4374
	default: {
4369
	default: {
4375
	  /* representation in store will be same so just move */
4370
	  /* representation in store will be same so just move */
4376
	  move (aa, dest, sp, 1);
4371
	  move(aa, dest, sp, 1);
4377
	  return mka;
4372
	  return mka;
4378
	}
4373
	}
4379
      }
4374
      }
4380
  out: 			/* d is destination register - do
4375
  out: 			/* d is destination register - do
4381
			   appropriate ands etc */
4376
			   appropriate ands etc */
4382
      if (d==NO_REG) return mka;
4377
      if (d==NO_REG) return mka;
4383
/*       (void)convert_shapes(nsh,name(sh(son(e))),a,d);*/
4378
/*       (void)convert_shapes(nsh,name(sh(son(e))),a,d);*/
4384
      switch(nsh){
4379
      switch (nsh) {
4385
	case ucharhd :{
4380
	case ucharhd:{
4386
	  if(is_signed(sh(son(e))) && !optop(e)) {
4381
	  if (is_signed(sh(son(e))) && !optop(e)) {
4387
	    if(error_treatment_is_trap(e)){
4382
	    if (error_treatment_is_trap(e)) {
4388
	      int new_lab = new_label();
4383
	      int new_lab = new_label();
4389
	      integer_branch(i_bge,a,new_lab);
4384
	      integer_branch(i_bge,a,new_lab);
4390
	      do_exception(f_overflow);
4385
	      do_exception(f_overflow);
4391
	      set_label(new_lab);
4386
	      set_label(new_lab);
4392
	    }
4387
	    }
4393
	    else{
4388
	    else{
4394
	      integer_branch(i_blt,a,trap_label(e));
4389
	      integer_branch(i_blt,a,trap_label(e));
4395
	    }
4390
	    }
4396
	    
4391
 
4397
	  }
4392
	  }
4398
	  if(!optop(e)){
4393
	  if (!optop(e)) {
4399
	    if(error_treatment_is_trap(e)){
4394
	    if (error_treatment_is_trap(e)) {
4400
	      test_unsigned_and_trap(a,255,f_overflow);
4395
	      test_unsigned_and_trap(a,255,f_overflow);
4401
	    }
4396
	    }
4402
	    else{
4397
	    else{
4403
	      test_unsigned(a,255,trap_label(e));
4398
	      test_unsigned(a,255,trap_label(e));
4404
	    }
4399
	    }
4405
	  }
4400
	  }
4406
	  operate_fmt_immediate(i_and,a,255,d);
4401
	  operate_fmt_immediate(i_and,a,255,d);
4407
	  break;
4402
	  break;
4408
	}
4403
	}
4409
	case scharhd :{
4404
	case scharhd:{
4410
	  if(!is_signed(sh(son(e))) && !optop(e)) {
4405
	  if (!is_signed(sh(son(e))) && !optop(e)) {
4411
	    setnoat();
4406
	    setnoat();
4412
	    operate_fmt_immediate(i_cmpule,a,0x7f,AT);
4407
	    operate_fmt_immediate(i_cmpule,a,0x7f,AT);
4413
	    if(!error_treatment_is_trap(e)){
4408
	    if (!error_treatment_is_trap(e)) {
4414
	      integer_branch(i_beq,AT,trap_label(e));
4409
	      integer_branch(i_beq,AT,trap_label(e));
4415
	    }
4410
	    }
4416
	    else{
4411
	    else{
4417
	      int new_lab = new_label();
4412
	      int new_lab = new_label();
4418
	      integer_branch(i_bne,AT,new_lab);
4413
	      integer_branch(i_bne,AT,new_lab);
4419
	      do_exception(f_overflow);
4414
	      do_exception(f_overflow);
4420
	      set_label(new_lab);
4415
	      set_label(new_lab);
4421
	    }
4416
	    }
4422
	    setat();
4417
	    setat();
4423
	  }
4418
	  }
4424
	  if(!optop(e)){ 
4419
	  if (!optop(e)) {
4425
	    if(error_treatment_is_trap(e)){
4420
	    if (error_treatment_is_trap(e)) {
4426
	      test_signed_and_trap(a,-128,127,f_overflow);
4421
	      test_signed_and_trap(a,-128,127,f_overflow);
4427
	    }
4422
	    }
4428
	    else{
4423
	    else{
4429
	      test_signed(a,-128,127,trap_label(e));
4424
	      test_signed(a,-128,127,trap_label(e));
4430
	    }
4425
	    }
4431
	  }
4426
	  }
4432
	  operate_fmt_immediate(i_extqh,a,1,d);
4427
	  operate_fmt_immediate(i_extqh,a,1,d);
4433
	  operate_fmt_immediate(i_sra,d,REG_SIZE-8,d);
4428
	  operate_fmt_immediate(i_sra,d,REG_SIZE-8,d);
4434
	  break;
4429
	  break;
4435
	}
4430
	}
4436
	case uwordhd :{
4431
	case uwordhd:{
4437
	  if(is_signed(sh(son(e))) && !optop(e)) {
4432
	  if (is_signed(sh(son(e))) && !optop(e)) {
4438
	    if(error_treatment_is_trap(e)){
4433
	    if (error_treatment_is_trap(e)) {
4439
	      int new_lab = new_label();
4434
	      int new_lab = new_label();
4440
	      integer_branch(i_bge,a,new_lab);
4435
	      integer_branch(i_bge,a,new_lab);
4441
	      do_exception(f_overflow);
4436
	      do_exception(f_overflow);
4442
	      set_label(new_lab);
4437
	      set_label(new_lab);
4443
	    }
4438
	    }
4444
	    else{
4439
	    else{
4445
	      integer_branch(i_blt,a,trap_label(e));
4440
	      integer_branch(i_blt,a,trap_label(e));
4446
	    }
4441
	    }
4447
	  }
4442
	  }
4448
	  if(!optop(e)){
4443
	  if (!optop(e)) {
4449
	    if(error_treatment_is_trap(e)){
4444
	    if (error_treatment_is_trap(e)) {
4450
	      test_unsigned_and_trap(a,0xffff,f_overflow);
4445
	      test_unsigned_and_trap(a,0xffff,f_overflow);
4451
	    }
4446
	    }
4452
	    else{
4447
	    else{
4453
	      test_unsigned(a,0xffff,trap_label(e));
4448
	      test_unsigned(a,0xffff,trap_label(e));
4454
	    }
-
 
4455
	  }
-
 
4456
	  operate_fmt_immediate(i_and,a,(1<<16)-1,d);
-
 
4457
	  break;
-
 
4458
	}
-
 
4459
	case swordhd : {
-
 
4460
	  if(!is_signed(sh(son(e))) && !optop(e)) {
-
 
4461
	    setnoat();
-
 
4462
	    operate_fmt_immediate(i_cmpule,a,0x7fff,AT);
-
 
4463
	    if(error_treatment_is_trap(e)){
-
 
4464
	      int new_lab = new_label();
-
 
4465
	      integer_branch(i_bne,AT,new_lab);
-
 
4466
	      do_exception(f_overflow);
-
 
4467
	      set_label(new_lab);
-
 
4468
	    }
-
 
4469
	    else{
-
 
4470
	      integer_branch(i_beq,AT,trap_label(e));
-
 
4471
	    }
-
 
4472
	    setat();
-
 
4473
	  }
-
 
4474
	  if(!optop(e)){
-
 
4475
	    if(error_treatment_is_trap(e)){
-
 
4476
	      test_signed_and_trap(a,-0x8000L,0x7fff,f_overflow);
-
 
4477
	    }
-
 
4478
	    else{
-
 
4479
	      test_signed(a,-0x8000L,0x7fff,trap_label(e));
-
 
4480
	    }
-
 
4481
	  }
-
 
4482
	  operate_fmt_immediate(i_sll,a,48,d);
-
 
4483
	  operate_fmt_immediate(i_sra,d,48,d);
-
 
4484
	  break;
-
 
4485
	}
-
 
4486
	case ulonghd :{
-
 
4487
	  if(is_signed(sh(son(e))) && !optop(e)) {
-
 
4488
	    if(error_treatment_is_trap(e)){
-
 
4489
	      int new_lab = new_label();
-
 
4490
	      integer_branch(i_bge,a,new_lab);
-
 
4491
	      do_exception(f_overflow);
-
 
4492
	      set_label(new_lab);
-
 
4493
	    }
-
 
4494
	    else{
-
 
4495
	      integer_branch(i_blt,a,trap_label(e));
-
 
4496
	    }
4449
	    }
4497
	  }
4450
	  }
-
 
4451
	  operate_fmt_immediate(i_and,a,(1<<16) -1,d);
-
 
4452
	  break;
-
 
4453
	}
-
 
4454
	case swordhd: {
-
 
4455
	  if (!is_signed(sh(son(e))) && !optop(e)) {
-
 
4456
	    setnoat();
-
 
4457
	    operate_fmt_immediate(i_cmpule,a,0x7fff,AT);
-
 
4458
	    if (error_treatment_is_trap(e)) {
-
 
4459
	      int new_lab = new_label();
-
 
4460
	      integer_branch(i_bne,AT,new_lab);
-
 
4461
	      do_exception(f_overflow);
-
 
4462
	      set_label(new_lab);
-
 
4463
	    }
-
 
4464
	    else{
-
 
4465
	      integer_branch(i_beq,AT,trap_label(e));
-
 
4466
	    }
-
 
4467
	    setat();
-
 
4468
	  }
-
 
4469
	  if (!optop(e)) {
-
 
4470
	    if (error_treatment_is_trap(e)) {
-
 
4471
	      test_signed_and_trap(a,-0x8000L,0x7fff,f_overflow);
-
 
4472
	    }
-
 
4473
	    else{
-
 
4474
	      test_signed(a,-0x8000L,0x7fff,trap_label(e));
-
 
4475
	    }
-
 
4476
	  }
-
 
4477
	  operate_fmt_immediate(i_sll,a,48,d);
-
 
4478
	  operate_fmt_immediate(i_sra,d,48,d);
-
 
4479
	  break;
-
 
4480
	}
-
 
4481
	case ulonghd:{
-
 
4482
	  if (is_signed(sh(son(e))) && !optop(e)) {
-
 
4483
	    if (error_treatment_is_trap(e)) {
-
 
4484
	      int new_lab = new_label();
-
 
4485
	      integer_branch(i_bge,a,new_lab);
-
 
4486
	      do_exception(f_overflow);
-
 
4487
	      set_label(new_lab);
-
 
4488
	    }
-
 
4489
	    else{
-
 
4490
	      integer_branch(i_blt,a,trap_label(e));
-
 
4491
	    }
-
 
4492
	  }
4498
	  if(!optop(e)){
4493
	  if (!optop(e)) {
4499
	    if(error_treatment_is_trap(e)){
4494
	    if (error_treatment_is_trap(e)) {
4500
	      test_unsigned_and_trap(a,0xffffffff,f_overflow);
4495
	      test_unsigned_and_trap(a,0xffffffff,f_overflow);
4501
	    }
4496
	    }
4502
	    else{
4497
	    else{
4503
	      test_unsigned(a,0xffffffff,trap_label(e));
4498
	      test_unsigned(a,0xffffffff,trap_label(e));
4504
	    }
4499
	    }
4505
	  }
4500
	  }
4506
	  operate_fmt_immediate(i_addl,a,0,d);
4501
	  operate_fmt_immediate(i_addl,a,0,d);
4507
	  /*operate_fmt_big_immediate(i_and,a,0xffffffff,d);*/
4502
	  /*operate_fmt_big_immediate(i_and,a,0xffffffff,d);*/
4508
	  break;
4503
	  break;
4509
	}
4504
	}
4510
	case slonghd :{
4505
	case slonghd:{
4511
	  if(!is_signed(sh(son(e))) && !optop(e)) {
4506
	  if (!is_signed(sh(son(e))) && !optop(e)) {
4512
	    setnoat();
4507
	    setnoat();
4513
	    operate_fmt_big_immediate(i_cmpule,a,0x7fffffff,AT);
4508
	    operate_fmt_big_immediate(i_cmpule,a,0x7fffffff,AT);
4514
	    if(error_treatment_is_trap(e)){
4509
	    if (error_treatment_is_trap(e)) {
4515
	      int new_lab = new_label();
4510
	      int new_lab = new_label();
4516
	      integer_branch(i_bne,AT,new_lab);
4511
	      integer_branch(i_bne,AT,new_lab);
4517
	      do_exception(f_overflow);
4512
	      do_exception(f_overflow);
4518
	      set_label(new_lab);
4513
	      set_label(new_lab);
4519
	    }
4514
	    }
4520
	    else{
4515
	    else{
4521
	      integer_branch(i_beq,AT,trap_label(e));
4516
	      integer_branch(i_beq,AT,trap_label(e));
4522
	    }
4517
	    }
4523
	    setat();
4518
	    setat();
4524
	  }
4519
	  }
4525
	  if(!optop(e)){
4520
	  if (!optop(e)) {
4526
	    if(error_treatment_is_trap(e)){
4521
	    if (error_treatment_is_trap(e)) {
4527
	      test_signed_and_trap(a,-0x80000000L,0x7fffffff,f_overflow);
4522
	      test_signed_and_trap(a,-0x80000000L,0x7fffffff,f_overflow);
4528
	    }
4523
	    }
4529
	    else{
4524
	    else{
4530
	      test_signed(a,-0x80000000L,0x7fffffff,trap_label(e));
4525
	      test_signed(a,-0x80000000L,0x7fffffff,trap_label(e));
4531
	    }
4526
	    }
4532
	  }
4527
	  }
4533
	  operate_fmt_immediate(i_sll,a,32,d);
4528
	  operate_fmt_immediate(i_sll,a,32,d);
4534
	  operate_fmt_immediate(i_sra,d,32,d);
4529
	  operate_fmt_immediate(i_sra,d,32,d);
4535
	  break;
4530
	  break;
4536
	}
4531
	}
4537
	case s64hd : {
4532
	case s64hd: {
4538
	  if(!is_signed(sh(e)) && !optop(e)) {
4533
	  if (!is_signed(sh(e)) && !optop(e)) {
4539
	    setnoat();
4534
	    setnoat();
4540
	    operate_fmt_big_immediate(i_cmpule,a,0x7fffffffffffffffL,AT);
4535
	    operate_fmt_big_immediate(i_cmpule,a,0x7fffffffffffffffL,AT);
4541
	    if(error_treatment_is_trap(e)){
4536
	    if (error_treatment_is_trap(e)) {
4542
	      int new_lab = new_label();
4537
	      int new_lab = new_label();
4543
	      integer_branch(i_bne,AT,new_lab);
4538
	      integer_branch(i_bne,AT,new_lab);
4544
	      do_exception(f_overflow);
4539
	      do_exception(f_overflow);
4545
	      set_label(new_lab);
4540
	      set_label(new_lab);
4546
	    }
4541
	    }
4547
	    else{
4542
	    else{
4548
	      integer_branch(i_beq,AT,trap_label(e));
4543
	      integer_branch(i_beq,AT,trap_label(e));
4549
	    }
4544
	    }
4550
	    setat();
4545
	    setat();
4551
	  }
4546
	  }
4552
	  if(!optop(e)){
4547
	  if (!optop(e)) {
4553
	    if(error_treatment_is_trap(e)){
4548
	    if (error_treatment_is_trap(e)) {
4554
	      test_signed_and_trap(a,-0x8000000000000000L,0x7fffffffffffffffL,
4549
	      test_signed_and_trap(a,-0x8000000000000000L,0x7fffffffffffffffL,
4555
				   f_overflow);
4550
				   f_overflow);
4556
	    }
4551
	    }
4557
	    else{
4552
	    else{
4558
	      test_signed(a,-0x8000000000000000L,0x7fffffffffffffffL,
4553
	      test_signed(a,-0x8000000000000000L,0x7fffffffffffffffL,
4559
				   trap_label(e));
4554
				   trap_label(e));
4560
	    }
4555
	    }
4561
	  }
4556
	  }
4562
	  operate_fmt(i_bis,a,a,d);
4557
	  operate_fmt(i_bis,a,a,d);
4563
	  break;
4558
	  break;
4564
	}
4559
	}
4565
	
4560
 
4566
	case u64hd :{
4561
	case u64hd:{
4567
	  if(is_signed(sh(e)) && !optop(e)){
4562
	  if (is_signed(sh(e)) && !optop(e)) {
4568
	    if(error_treatment_is_trap(e)){
4563
	    if (error_treatment_is_trap(e)) {
4569
	      int new_lab = new_label();
4564
	      int new_lab = new_label();
4570
	      integer_branch(i_bge,a,new_lab);
4565
	      integer_branch(i_bge,a,new_lab);
4571
	      do_exception(f_overflow);
4566
	      do_exception(f_overflow);
4572
	      set_label(new_lab);
4567
	      set_label(new_lab);
4573
	    }
4568
	    }
Line 4578... Line 4573...
4578
	  operate_fmt(i_bis,a,a,d);
4573
	  operate_fmt(i_bis,a,a,d);
4579
	  break;
4574
	  break;
4580
	}
4575
	}
4581
	default:failer("Illegal shape in chvar");
4576
	default:failer("Illegal shape in chvar");
4582
      }
4577
      }
4583
#if 0       
4578
#if 0
4584
      if (nsh == ucharhd) {
4579
      if (nsh == ucharhd) {
4585
	operate_fmt_immediate (i_and, a, 255,d);
4580
	operate_fmt_immediate(i_and, a, 255,d);
4586
      }
4581
      }
4587
      else if (nsh == uwordhd) {
4582
      else if (nsh == uwordhd) {
4588
	operate_fmt_immediate (i_and,a, (1 << 16) - 1,d);
4583
	operate_fmt_immediate(i_and,a,(1 << 16) - 1,d);
4589
	}
4584
	}
4590
      else if (nsh == scharhd) {
4585
      else if (nsh == scharhd) {
4591
	/*	      operate_fmt_immediate (i_sll,a,REG_SIZE-8,d);*/
4586
	/*	      operate_fmt_immediate (i_sll,a,REG_SIZE-8,d);*/
4592
	operate_fmt_immediate (i_extqh,a,1,d);
4587
	operate_fmt_immediate(i_extqh,a,1,d);
4593
	operate_fmt_immediate (i_sra,d,REG_SIZE-8,d);
4588
	operate_fmt_immediate(i_sra,d,REG_SIZE-8,d);
4594
      }
4589
      }
4595
      else if (nsh == swordhd) {
4590
      else if (nsh == swordhd) {
4596
	operate_fmt_immediate (i_sll, a, 32,d);
4591
	operate_fmt_immediate(i_sll, a, 32,d);
4597
	operate_fmt_immediate (i_sra, d, 32,d);
4592
	operate_fmt_immediate(i_sra, d, 32,d);
4598
      }
4593
      }
4599
#endif
4594
#endif
4600
      mka.regmove = d;
4595
      mka.regmove = d;
4601
      return mka;
4596
      return mka;
4602
    } /* end chvar */
4597
    } /* end chvar */
4603
 
4598
 
4604
    case minus_tag : 
4599
    case minus_tag:
4605
    case offset_subtract_tag :{
4600
    case offset_subtract_tag:{
4606
      if(optop(e)){
4601
      if (optop(e)) {
4607
	mka.regmove = non_comm_op (e,sp,dest,is64(sh(e))?i_subq:i_subl);
4602
	mka.regmove = non_comm_op(e,sp,dest,is64(sh(e))?i_subq:i_subl);
4608
	return mka;
4603
	return mka;
4609
      }
4604
      }
4610
#if 0
4605
#if 0
4611
      if(error_treatment_is_trap(e) && is_signed(sh(e))){
4606
      if (error_treatment_is_trap(e) && is_signed(sh(e))) {
4612
	mka.regmove = non_comm_op (e,sp,dest,is64(sh(e))?i_subqv:i_sublv);
4607
	mka.regmove = non_comm_op(e,sp,dest,is64(sh(e))?i_subqv:i_sublv);
4613
	return mka;
4608
	return mka;
4614
      }
4609
      }
4615
#endif
4610
#endif
4616
      else{
4611
      else{
4617
/*	   if(!optop(e)) check_exception(e,sp);*/
4612
/*	   if(!optop(e)) check_exception(e,sp);*/
Line 4624... Line 4619...
4624
	nsp = guardreg(r1, sp);
4619
	nsp = guardreg(r1, sp);
4625
	r2 = reg_operand(bro(son(e)), nsp);
4620
	r2 = reg_operand(bro(son(e)), nsp);
4626
	nsp = guardreg(r2, nsp);
4621
	nsp = guardreg(r2, nsp);
4627
	r0 = getreg(nsp.fixed);
4622
	r0 = getreg(nsp.fixed);
4628
	nsp = guardreg(r0,nsp);
4623
	nsp = guardreg(r0,nsp);
4629
	operate_fmt((is64(sh(e)))?i_subq:i_subl, r1, r2,r0);  
4624
	operate_fmt((is64(sh(e)))?i_subq:i_subl, r1, r2,r0);
4630
	switch(name(sh(e))) {
4625
	switch (name(sh(e))) {
4631
	  case s64hd :  
4626
	  case s64hd:
4632
	  case slonghd : {
4627
	  case slonghd: {
4633
	    r3 = getreg(nsp.fixed);
4628
	    r3 = getreg(nsp.fixed);
4634
	    operate_fmt(i_xor,r1, r2,r3);
4629
	    operate_fmt(i_xor,r1, r2,r3);
4635
	    integer_branch(i_bge,r3,over);
4630
	    integer_branch(i_bge,r3,over);
4636
	    operate_fmt(i_xor,r0,r1,r3);
4631
	    operate_fmt(i_xor,r0,r1,r3);
4637
	    if(error_treatment_is_trap(e)){
4632
	    if (error_treatment_is_trap(e)) {
4638
	      integer_branch(i_bge,r3,over);
4633
	      integer_branch(i_bge,r3,over);
4639
	      do_exception(f_overflow);
4634
	      do_exception(f_overflow);
4640
	    }
4635
	    }
4641
	    else{
4636
	    else{
4642
	      integer_branch(i_blt,r3,trap);
4637
	      integer_branch(i_blt,r3,trap);
4643
	    }
4638
	    }
4644
	    set_label(over);
4639
	    set_label(over);
4645
	    break;
4640
	    break;
4646
	  }
4641
	  }
4647
	  case u64hd :
4642
	  case u64hd:
4648
	  case ulonghd : {
4643
	  case ulonghd: {
4649
	    r3 = getreg(guardreg(r0, nsp).fixed);
4644
	    r3 = getreg(guardreg(r0, nsp).fixed);
4650
	    operate_fmt(i_cmpult,r1,r2,r3);
4645
	    operate_fmt(i_cmpult,r1,r2,r3);
4651
	    if(error_treatment_is_trap(e)){
4646
	    if (error_treatment_is_trap(e)) {
4652
	      int ok_lab = new_label();
4647
	      int ok_lab = new_label();
4653
	      integer_branch(i_beq,r3,ok_lab);
4648
	      integer_branch(i_beq,r3,ok_lab);
4654
	      do_exception(f_overflow);
4649
	      do_exception(f_overflow);
4655
	      set_label(ok_lab);
4650
	      set_label(ok_lab);
4656
	    }
4651
	    }
4657
	    else{
4652
	    else{
4658
	      integer_branch(i_bne,r3,trap);
4653
	      integer_branch(i_bne,r3,trap);
4659
	    }
4654
	    }
4660
	    break;
4655
	    break;
4661
	  }
4656
	  }
4662
	  case scharhd : {
4657
	  case scharhd: {
4663
	    if(error_treatment_is_trap(e)){
4658
	    if (error_treatment_is_trap(e)) {
4664
	      test_signed_and_trap(r0,-128,127,f_overflow);
4659
	      test_signed_and_trap(r0,-128,127,f_overflow);
4665
	    }
4660
	    }
4666
	    else{
4661
	    else{
4667
	      test_signed(r0, -128, 127, trap);
4662
	      test_signed(r0, -128, 127, trap);
4668
	    }
4663
	    }
4669
	    break;
4664
	    break;
4670
	  }
4665
	  }
4671
	  case ucharhd : {
4666
	  case ucharhd: {
4672
	    if(error_treatment_is_trap(e)){
4667
	    if (error_treatment_is_trap(e)) {
4673
	      test_unsigned_and_trap(r0,255,f_overflow);
4668
	      test_unsigned_and_trap(r0,255,f_overflow);
4674
	    }
4669
	    }
4675
	    else{
4670
	    else{
4676
	      test_unsigned(r0, 255, trap);
4671
	      test_unsigned(r0, 255, trap);
4677
	    }
4672
	    }
4678
	    break;
4673
	    break;
4679
	  }
4674
	  }
4680
	  case swordhd : {
4675
	  case swordhd: {
4681
	    if(error_treatment_is_trap(e)){
4676
	    if (error_treatment_is_trap(e)) {
4682
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4677
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4683
	    }
4678
	    }
4684
	    else{
4679
	    else{
4685
	      test_signed(r0, -0x8000L, 0x7fff, trap);
4680
	      test_signed(r0, -0x8000L, 0x7fff, trap);
4686
	    }
4681
	    }
4687
	    break;
4682
	    break;
4688
	  }
4683
	  }
4689
	  case uwordhd : {
4684
	  case uwordhd: {
4690
	    if(error_treatment_is_trap(e)){
4685
	    if (error_treatment_is_trap(e)) {
4691
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4686
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4692
	    }
4687
	    }
4693
	    else{
4688
	    else{
4694
	      test_unsigned(r0, 0xffff, trap);
4689
	      test_unsigned(r0, 0xffff, trap);
4695
	    }
4690
	    }
4696
	    break;
4691
	    break;
4697
	  }
4692
	  }
4698
	  default: failer("NOT integer in minus with o/f");
4693
	  default: failer("NOT integer in minus with o/f");
4699
	}
4694
	}
4700
	setregalt(aa, r0);
4695
	setregalt(aa, r0);
4701
	mka.regmove = move(aa, dest, nsp, 0);
4696
	mka.regmove = move(aa, dest, nsp, 0);
4702
	return mka;	 
4697
	return mka;
4703
      }
4698
      }
4704
      return mka;
4699
      return mka;
4705
    }
4700
    }
4706
				/* end minus */
4701
				/* end minus */
4707
    case mult_tag : 
4702
    case mult_tag:
4708
    case offset_mult_tag :{
4703
    case offset_mult_tag:{
4709
      exp rop = bro (son (e));
4704
      exp rop = bro(son(e));
4710
      instruction mult_ins;
4705
      instruction mult_ins;
4711
      if(!optop(e) & error_treatment_is_trap(e)){
4706
      if (!optop(e) & error_treatment_is_trap(e)) {
4712
	mult_ins = is64(sh(e))?i_mulqv : i_mullv;
4707
	mult_ins = is64(sh(e))?i_mulqv : i_mullv;
4713
      }
4708
      }
4714
      else{
4709
      else{
4715
	mult_ins = is64(sh(e))?i_mulq : i_mull;
4710
	mult_ins = is64(sh(e))?i_mulq : i_mull;
4716
      }
4711
      }
4717
       
4712
 
4718
      if (last (rop) && name (rop) == val_tag && optop(e)) {
4713
      if (last(rop) && name(rop) == val_tag && optop(e)) {
4719
	/* multiplication by constant m */
4714
	/* multiplication by constant m */
4720
	int   m = no (rop);
4715
	int   m = no(rop);
4721
	int   p2;
4716
	int   p2;
4722
	if (m > 1 && (
4717
	if (m > 1 && (
4723
		      ((p2 = m) & (m - 1)) == 0 ||
4718
		     ((p2 = m) & (m - 1)) == 0 ||
4724
		      (m & (p2 = m + 1)) == 0 ||
4719
		     (m & (p2 = m + 1)) == 0 ||
4725
		      ((p2 = m - 1) & (m - 2)) == 0
4720
		     ((p2 = m - 1) & (m - 2)) == 0
4726
		      )) {
4721
		     )) {
4727
	  /* m = 2^shleng   or  m = 2^(shleng +/- 1) 
4722
	  /* m = 2^shleng   or  m = 2^(shleng +/- 1)
4728
	   */
4723
	   */
4729
	  int   r = reg_operand (son (e), sp);
4724
	  int   r = reg_operand(son(e), sp);
4730
	  /* evaluate first arguement */
4725
	  /* evaluate first arguement */
4731
	  int   rr;
4726
	  int   rr;
4732
	  space nsp;
4727
	  space nsp;
4733
	  int   shleng;
4728
	  int   shleng;
4734
	  ans aa;
4729
	  ans aa;
4735
	  for (shleng = 0; p2 != 1; shleng++)
4730
	  for (shleng = 0; p2 != 1; shleng++)
4736
	    p2 >>= 1;
4731
	    p2 >>= 1;
4737
 
4732
 
4738
	  switch (dest.answhere.discrim) {
4733
	  switch (dest.answhere.discrim) {
4739
	    case inreg : {
4734
	    case inreg: {
4740
	      rr = regalt (dest.answhere);
4735
	      rr = regalt(dest.answhere);
4741
	      if (rr != r || (m & (m - 1)) == 0) {
4736
	      if (rr != r || (m & (m - 1)) == 0) {
4742
		nsp = sp;
4737
		nsp = sp;
4743
		break;
4738
		break;
4744
	      }
4739
	      }
4745
	    }
4740
	    }
4746
	    FALL_THROUGH;
4741
	    FALL_THROUGH;
4747
	    default: {
4742
	    default: {
4748
	      nsp = guardreg (r, sp);
4743
	      nsp = guardreg(r, sp);
4749
	      rr = getreg (nsp.fixed);
4744
	      rr = getreg(nsp.fixed);
4750
	    }
4745
	    }
4751
	  }	
4746
	  }
4752
	    
4747
 
4753
	  operate_fmt_immediate (i_sll,r,shleng,rr);
4748
	  operate_fmt_immediate(i_sll,r,shleng,rr);
4754
 
4749
 
4755
	  if ((m & (m - 1)) != 0)
4750
	  if ((m & (m - 1))!= 0)
4756
	    if(optop(e)){
4751
	    if (optop(e)) {
4757
	      operate_fmt (((m & (m + 1)) == 0) ? i_subq : i_addq, rr, r, rr);
4752
	      operate_fmt(((m & (m + 1)) == 0)? i_subq : i_addq, rr, r, rr);
4758
	    }
4753
	    }
4759
	    else{
4754
	    else{
4760
	      operate_fmt (((m&(m+1))==0) ? i_subqv : i_addqv, rr, r, rr);
4755
	      operate_fmt(((m& (m+1)) ==0)? i_subqv : i_addqv, rr, r, rr);
4761
	    }
4756
	    }
4762
	  if(!optop(e) && !error_treatment_is_trap(e)){
4757
	  if (!optop(e) && !error_treatment_is_trap(e)) {
4763
	    check_exception(e,sp);
4758
	    check_exception(e,sp);
4764
	  }
4759
	  }
4765
	  setregalt (aa, rr);
4760
	  setregalt(aa, rr);
4766
	  mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
4761
	  mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
4767
	  return mka;
4762
	  return mka;
4768
	}
4763
	}
4769
      } /* else do straightforward mult */
4764
      } /* else do straightforward mult */
4770
 
4765
 
4771
      if(optop(e) /*|| error_treatment_is_trap(e)*/) {
4766
      if(optop(e) /*|| error_treatment_is_trap(e)*/) {
4772
	mka.regmove = comm_op (e, sp, dest, mult_ins);
4767
	mka.regmove = comm_op(e, sp, dest, mult_ins);
4773
      }
4768
      }
4774
      else /* if (!optop(e) && !error_treatment_is_trap(e)) */{
4769
      else /* if (!optop(e) && !error_treatment_is_trap(e)) */{
4775
	int r1 = reg_operand(son(e), sp);
4770
	int r1 = reg_operand(son(e), sp);
4776
	int r2,r0;
4771
	int r2,r0;
4777
	/*int over = new_label();*/
4772
	/*int over = new_label();*/
Line 4790... Line 4785...
4790
	integer_branch(i_br,31,contlab);
4785
	integer_branch(i_br,31,contlab);
4791
	set_label(zerolab);
4786
	set_label(zerolab);
4792
	operate_fmt(i_bis,31,31,r0);
4787
	operate_fmt(i_bis,31,31,r0);
4793
	integer_branch(i_br,31,mult_end_lab);
4788
	integer_branch(i_br,31,mult_end_lab);
4794
	set_label(contlab);
4789
	set_label(contlab);
4795
	
4790
 
4796
	  /*	operate_fmt(is64(sh(e))?i_mulq:i_mull,r1,r2,r0);*/
4791
	  /*	operate_fmt(is64(sh(e))?i_mulq:i_mull,r1,r2,r0);*/
4797
	if(error_treatment_is_trap(e)){
4792
	if (error_treatment_is_trap(e)) {
4798
	  operate_fmt(i_mulqv,r1,r2,r0);
4793
	  operate_fmt(i_mulqv,r1,r2,r0);
4799
	}
4794
	}
4800
	else{
4795
	else{
4801
	  operate_fmt(i_mulq,r1,r2,r0);
4796
	  operate_fmt(i_mulq,r1,r2,r0);
4802
	}
4797
	}
4803
	switch(name(sh(e))){
4798
	switch (name(sh(e))) {
4804
	  case u64hd :
4799
	  case u64hd:
4805
	  case s64hd :{
4800
	  case s64hd:{
4806
	    int r3 = getreg(sp.fixed);
4801
	    int r3 = getreg(sp.fixed);
4807
	    int oklab = new_label();
4802
	    int oklab = new_label();
4808
	    integer_branch(i_beq,r1,oklab);
4803
	    integer_branch(i_beq,r1,oklab);
4809
	    integer_branch(i_beq,r2,oklab);
4804
	    integer_branch(i_beq,r2,oklab);
4810
	    if(error_treatment_is_trap(e)){
4805
	    if (error_treatment_is_trap(e)) {
4811
	      int new_lab = new_label();
4806
	      int new_lab = new_label();
4812
	      integer_branch(i_bne,r0,new_lab);
4807
	      integer_branch(i_bne,r0,new_lab);
4813
	      do_exception(f_overflow);
4808
	      do_exception(f_overflow);
4814
	      set_label(new_lab);
4809
	      set_label(new_lab);
4815
	    }
4810
	    }
4816
	    else{
4811
	    else{
4817
	      integer_branch(i_beq,r0,trap_label(e));
4812
	      integer_branch(i_beq,r0,trap_label(e));
4818
	    }
4813
	    }
4819
	    set_label(oklab);
4814
	    set_label(oklab);
4820
	    operate_fmt(i_xor,r1,r2,r3);
4815
	    operate_fmt(i_xor,r1,r2,r3);
4821
	    /*integer_branch(i_blt,r3,over);*/
4816
	    /*integer_branch(i_blt,r3,over);*/
4822
	    operate_fmt(i_xor,r3,r0,r3);
4817
	    operate_fmt(i_xor,r3,r0,r3);
4823
	    if(error_treatment_is_trap(e)){
4818
	    if (error_treatment_is_trap(e)) {
4824
	      int ok_lab = new_label();
4819
	      int ok_lab = new_label();
4825
	      integer_branch(i_bge,r3,ok_lab);
4820
	      integer_branch(i_bge,r3,ok_lab);
4826
	      do_exception(f_overflow);
4821
	      do_exception(f_overflow);
4827
	      set_label(ok_lab);
4822
	      set_label(ok_lab);
4828
	    }
4823
	    }
Line 4830... Line 4825...
4830
	      integer_branch(i_blt,r3,trap_label(e));
4825
	      integer_branch(i_blt,r3,trap_label(e));
4831
	    }
4826
	    }
4832
	    /*set_label(over);*/
4827
	    /*set_label(over);*/
4833
	    break;
4828
	    break;
4834
	  }
4829
	  }
4835
	  case slonghd : {
4830
	  case slonghd: {
4836
	    if(!error_treatment_is_trap(e)){
4831
	    if (!error_treatment_is_trap(e)) {
4837
	      int r3 = getreg(sp.fixed);
4832
	      int r3 = getreg(sp.fixed);
4838
	      operate_fmt(i_xor,r1,r2,r3);
4833
	      operate_fmt(i_xor,r1,r2,r3);
4839
	      operate_fmt(i_xor,r3,r0,r3);
4834
	      operate_fmt(i_xor,r3,r0,r3);
4840
	      integer_branch(i_blt,r3,trap_label(e));
4835
	      integer_branch(i_blt,r3,trap_label(e));
4841
	      test_signed(r0,-0x80000000L,0x7fffffff,trap_label(e));
4836
	      test_signed(r0,-0x80000000L,0x7fffffff,trap_label(e));
Line 4852... Line 4847...
4852
#endif
4847
#endif
4853
	      test_signed_and_trap(r0,-0x80000000L,0x7fffffff,f_overflow);
4848
	      test_signed_and_trap(r0,-0x80000000L,0x7fffffff,f_overflow);
4854
	    }
4849
	    }
4855
	    break;
4850
	    break;
4856
	  }
4851
	  }
4857
	  case ulonghd : {
4852
	  case ulonghd: {
4858
	    if(!error_treatment_is_trap(e)){
4853
	    if (!error_treatment_is_trap(e)) {
4859
	      int r3 = getreg(sp.fixed);
4854
	      int r3 = getreg(sp.fixed);
4860
	      operate_fmt(i_xor,r1,r2,r3);
4855
	      operate_fmt(i_xor,r1,r2,r3);
4861
	      integer_branch(i_blt,r3,trap_label(e));
4856
	      integer_branch(i_blt,r3,trap_label(e));
4862
	      test_unsigned(r0,0xffffffff,trap_label(e));
4857
	      test_unsigned(r0,0xffffffff,trap_label(e));
4863
	    }
4858
	    }
Line 4870... Line 4865...
4870
	      set_label(oklab);
4865
	      set_label(oklab);
4871
	      test_unsigned_and_trap(r0,0xffffffff,f_overflow);
4866
	      test_unsigned_and_trap(r0,0xffffffff,f_overflow);
4872
	    }
4867
	    }
4873
	    break;
4868
	    break;
4874
	  }
4869
	  }
4875
	  case uwordhd :{
4870
	  case uwordhd:{
4876
	    if(error_treatment_is_trap(e)){
4871
	    if (error_treatment_is_trap(e)) {
4877
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4872
	      test_unsigned_and_trap(r0,0xffff,f_overflow);
4878
	    }
4873
	    }
4879
	    else{
4874
	    else{
4880
	      test_unsigned(r0,0xffff,trap_label(e));
4875
	      test_unsigned(r0,0xffff,trap_label(e));
4881
	    }
4876
	    }
4882
	    break;
4877
	    break;
4883
	  }
4878
	  }
4884
	  case swordhd :{
4879
	  case swordhd:{
4885
	    if(error_treatment_is_trap(e)){
4880
	    if (error_treatment_is_trap(e)) {
4886
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4881
	      test_signed_and_trap(r0,-0x8000L,0x7fff,f_overflow);
4887
	    }
4882
	    }
4888
	    else{
4883
	    else{
4889
	      test_signed(r0,-0x8000L,0x7fff,trap_label(e));
4884
	      test_signed(r0,-0x8000L,0x7fff,trap_label(e));
4890
	    }
4885
	    }
4891
	    break;
4886
	    break;
4892
	  }
4887
	  }
4893
	  case ucharhd :{
4888
	  case ucharhd:{
4894
	    if(error_treatment_is_trap(e)){
4889
	    if (error_treatment_is_trap(e)) {
4895
	      test_unsigned_and_trap(r0,255,f_overflow);
4890
	      test_unsigned_and_trap(r0,255,f_overflow);
4896
	    }
4891
	    }
4897
	    else{
4892
	    else{
4898
	      test_unsigned(r0,255,trap_label(e));
4893
	      test_unsigned(r0,255,trap_label(e));
4899
	    }
4894
	    }
4900
	    break;
4895
	    break;
4901
	  }
4896
	  }
4902
	  case scharhd :{   
4897
	  case scharhd:{
4903
	    if(error_treatment_is_trap(e)){
4898
	    if (error_treatment_is_trap(e)) {
4904
	      test_signed_and_trap(r0,-128,127,f_overflow);
4899
	      test_signed_and_trap(r0,-128,127,f_overflow);
4905
	    }
4900
	    }
4906
	    else{
4901
	    else{
4907
	      test_signed(r0,-128,127,trap_label(e));
4902
	      test_signed(r0,-128,127,trap_label(e));
4908
	    }
4903
	    }
Line 4915... Line 4910...
4915
	mka.regmove = move(aa,dest,nsp,0);
4910
	mka.regmove = move(aa,dest,nsp,0);
4916
      }
4911
      }
4917
      return mka;
4912
      return mka;
4918
    } /* end mult */
4913
    } /* end mult */
4919
 
4914
 
4920
    case div1_tag :
4915
    case div1_tag:
4921
    case div2_tag : 
4916
    case div2_tag:
4922
    case offset_div_by_int_tag : 
4917
    case offset_div_by_int_tag:
4923
    case offset_div_tag : 
4918
    case offset_div_tag:
4924
    case div0_tag :{
4919
    case div0_tag:{
4925
      exp rop = bro (son (e));
4920
      exp rop = bro(son(e));
4926
      exp lop = son(e);
4921
      exp lop = son(e);
4927
      bool uns = (name (sh (e)) & 1) == 0; /* ?? */
4922
      bool uns = (name (sh (e)) & 1) == 0; /* ?? */
4928
      space nsp;
4923
      space nsp;
4929
      int r0;
4924
      int r0;
4930
      ans aa;
4925
      ans aa;
4931
      ash a;
4926
      ash a;
4932
      instruction div_ins;
4927
      instruction div_ins;
4933
      if (name (rop) == val_tag) { 
4928
      if (name(rop) == val_tag) {
4934
	/* unsigned division by constant */
4929
	/* unsigned division by constant */
4935
	int   m = no (rop);
4930
	int   m = no(rop);
4936
	if((m == 0) && !optop(e)) {
4931
	if ((m == 0) && !optop(e)) {
4937
	  integer_branch(i_br,31,trap_label(e));
4932
	  integer_branch(i_br,31,trap_label(e));
4938
	}
4933
	}
4939
	
4934
 
4940
	if (m > 1 && (m & (m - 1)) == 0) {
4935
	if (m > 1 && (m & (m - 1)) == 0) {
4941
	  int   r = reg_operand (son (e), sp); 
4936
	  int   r = reg_operand(son(e), sp);
4942
	  /* replace div by 2^shleng by arith sh right shleng */
4937
	  /* replace div by 2^shleng by arith sh right shleng */
4943
	  int   shleng;
4938
	  int   shleng;
4944
	  int   rr;
4939
	  int   rr;
4945
	  for (shleng = 0; m != 1; shleng++)
4940
	  for (shleng = 0; m != 1; shleng++)
4946
	    m >>= 1;
4941
	    m >>= 1;
4947
                
-
 
-
 
4942
 
4948
	  rr = regfrmdest(&dest, (guardreg(r,sp)));
4943
	  rr = regfrmdest(&dest,(guardreg(r,sp)));
4949
	  operate_fmt_immediate ((uns) ? i_srl : i_sra,r, shleng,rr);
4944
	  operate_fmt_immediate((uns)? i_srl : i_sra,r, shleng,rr);
4950
	  setregalt (aa, rr);
4945
	  setregalt(aa, rr);
4951
	  mka.regmove = move (aa, dest, guardreg(r,guardreg (rr, sp)), 1);
4946
	  mka.regmove = move(aa, dest, guardreg(r,guardreg(rr, sp)), 1);
4952
	  return mka; 
4947
	  return mka;
4953
	}
4948
	}
4954
	else if(use_umulh_for_div){
4949
	else if (use_umulh_for_div) {
4955
	  if(m>0){		
4950
	  if (m>0) {
4956
	    int r = reg_operand(son(e),sp);	
4951
	    int r = reg_operand(son(e),sp);
4957
	    int rr = regfrmdest(&dest,sp);	
4952
	    int rr = regfrmdest(&dest,sp);
4958
	    if(m!=1){		/* no point in dividing by 1 ! */
4953
	    if(m!=1){		/* no point in dividing by 1 ! */
4959
#if DO_NEW_DIVISION
4954
#if DO_NEW_DIVISION
4960
	      divide_by_constant(e,lop,rop,rr,nsp);
4955
	      divide_by_constant(e,lop,rop,rr,nsp);
4961
#else
4956
#else
4962
	      divide_by_constant(r,make_INT64(0,m),rr,guardreg(r,sp));
4957
	      divide_by_constant(r,make_INT64(0,m),rr,guardreg(r,sp));
4963
#endif
4958
#endif
4964
	    }
4959
	    }
4965
	    else{
4960
	    else{
4966
	      rr=r;
4961
	      rr=r;
4967
	    }
4962
	    }
4968
	    setregalt (aa, rr);
4963
	    setregalt(aa, rr);
4969
	    mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
4964
	    mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
4970
	    return mka;
4965
	    return mka;
4971
	  }
4966
	  }
4972
	}
4967
	}
4973
      }
4968
      }
4974
      a = ashof(sh(son(e)));
4969
      a = ashof(sh(son(e)));
4975
      if (!optop(e) && !error_treatment_is_trap(e)) {/* test for (-inf)/-1 and /0 */
4970
      if (!optop(e) && !error_treatment_is_trap(e)) {/* test for (-inf)/-1 and /0 */
4976
	check_exception(e,sp);
4971
	check_exception(e,sp);
4977
      }
4972
      }
4978
      nsp.fixed = (sp.fixed)|(1<<23)|(1<<24)|(1<<25)|(1<<27);
4973
      nsp.fixed = (sp.fixed) | (1<<23) | (1<<24) | (1<<25) | (1<<27);
4979
      div_ins=(uns)?((a.ashsize==32)?i_divlu:i_divqu):
4974
      div_ins= (uns)?((a.ashsize==32)?i_divlu:i_divqu):
4980
	(a.ashsize==32)?i_divl:i_divq;
4975
	(a.ashsize==32)?i_divl:i_divq;
4981
      if(!optop(e) && !error_treatment_is_trap(e)){
4976
      if (!optop(e) && !error_treatment_is_trap(e)) {
4982
	int rd = reg_operand(rop,sp);
4977
	int rd = reg_operand(rop,sp);
4983
	integer_branch(i_beq,rd,no(son(pt(e))));
4978
	integer_branch(i_beq,rd,no(son(pt(e))));
4984
      }
4979
      }
4985
      r0 = divide_using_div(e,lop,rop,dest,nsp,div_ins);
4980
      r0 = divide_using_div(e,lop,rop,dest,nsp,div_ins);
4986
      setregalt(aa, r0);
4981
      setregalt(aa, r0);
4987
      clear_reg(AT);
4982
      clear_reg(AT);
4988
      clear_reg(23);
4983
      clear_reg(23);
4989
      clear_reg(24);
4984
      clear_reg(24);
4990
      clear_reg(25);
4985
      clear_reg(25);
4991
      clear_reg(27);
4986
      clear_reg(27);
4992
       
4987
 
4993
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
4988
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
4994
      return mka;
4989
      return mka;
4995
    }
4990
    }
4996
#if 0
4991
#if 0
4997
    case div1_tag: {  /* only applies to signed operands */
4992
    case div1_tag: {  /* only applies to signed operands */
4998
      exp rop = bro (son (e));
4993
      exp rop = bro(son(e));
4999
      exp lop = son(e);
4994
      exp lop = son(e);
5000
      int ne = name(e);
4995
      int ne = name(e);
5001
      space nsp;
4996
      space nsp;
5002
      int r0, r1, r2;
4997
      int r0, r1, r2;
5003
      int lab, treg;
4998
      int lab, treg;
5004
      ans aa;		
4999
      ans aa;
5005
      r2 = reg_operand(rop, sp);
5000
      r2 = reg_operand(rop, sp);
5006
      nsp = guardreg(r2, sp);
5001
      nsp = guardreg(r2, sp);
5007
      r1 = reg_operand(lop, nsp);
5002
      r1 = reg_operand(lop, nsp);
5008
 
5003
 
5009
		
5004
 
5010
      if (!optop(e)) { /* test for (-inf)/-1 and /0 */
5005
      if (!optop(e)) { /* test for (-inf)/-1 and /0 */
5011
	long over = new_label();
5006
	long over = new_label();
5012
	long trap = no (son (pt (e)));
5007
	long trap = no(son(pt(e)));
5013
	ans aa;	   
5008
	ans aa;
5014
	set_label(over);      
5009
	set_label(over);
5015
      }
5010
      }
5016
      r0 = regfrmdest(&dest,nsp);
5011
      r0 = regfrmdest(&dest,nsp);
5017
      treg = getreg(guardreg(r0,nsp).fixed);
5012
      treg = getreg(guardreg(r0,nsp).fixed);
5018
      lab = new_label();
5013
      lab = new_label();
5019
      operate_fmt(i_xor, treg, r2, treg);
5014
      operate_fmt(i_xor, treg, r2, treg);
5020
      operate_fmt(i_sra, treg, 31,treg);
5015
      operate_fmt(i_sra, treg, 31,treg);
5021
      operate_fmt(i_addq, r0,treg,r0);
5016
      operate_fmt(i_addq, r0,treg,r0);
5022
      set_label(lab);		
5017
      set_label(lab);
5023
      setregalt(aa, r0);
5018
      setregalt(aa, r0);
5024
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
5019
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
5025
      return mka;
5020
      return mka;
5026
    }
5021
    }
5027
#endif
5022
#endif
5028
	   
-
 
5029
 
5023
 
-
 
5024
 
5030
    case neg_tag : 
5025
    case neg_tag:
5031
    case offset_negate_tag :{
5026
    case offset_negate_tag:{
5032
      if (optop(e) /* || (name(sh(e)) & 1) ==0 */ ) {
5027
      if (optop(e) /* || (name(sh(e)) & 1) ==0 */ ) {
5033
	int r1=getreg(sp.fixed);
5028
	int r1=getreg(sp.fixed);
5034
	int a1;
5029
	int a1;
5035
	space nsp;
5030
	space nsp;
5036
	a1 = reg_operand(son(e),sp);
5031
	a1 = reg_operand(son(e),sp);
5037
	if(dest.answhere.discrim == inreg) {
5032
	if (dest.answhere.discrim == inreg) {
5038
	  int d = regalt(dest.answhere);
5033
	  int d = regalt(dest.answhere);
5039
	  operate_fmt(is64(sh(e))?i_subq:i_subl,31,a1,d);
5034
	  operate_fmt(is64(sh(e))?i_subq:i_subl,31,a1,d);
5040
	  /*if (optop(e)) tidyshort(d,sh(e));*/
5035
	  /*if (optop(e)) tidyshort(d,sh(e));*/
5041
	}
5036
	}
5042
	else {
5037
	else {
5043
	  ans a;
5038
	  ans a;
5044
	  setregalt (a,r1);
5039
	  setregalt(a,r1);
5045
	  operate_fmt(is64(sh(e))?i_subq:i_subl,31,a1,r1);
5040
	  operate_fmt(is64(sh(e))?i_subq:i_subl,31,a1,r1);
5046
	  /*if (optop(e)) tidyshort(r1,sh(e));*/
5041
	  /*if (optop(e)) tidyshort(r1,sh(e));*/
5047
	  nsp=guardreg(r1,sp);
5042
	  nsp=guardreg(r1,sp);
5048
	  move(a,dest,nsp,1);
5043
	  move(a,dest,nsp,1);
5049
	  mka.regmove = r1;
5044
	  mka.regmove = r1;
5050
	}
5045
	}
5051
	return mka;
5046
	return mka;
5052
      }	
5047
      }
5053
      else {
5048
      else {
5054
	int r1 = reg_operand(son(e), sp);
5049
	int r1 = reg_operand(son(e), sp);
5055
	space nsp;
5050
	space nsp;
5056
	/* int trap = trap_label(e); */
5051
	/* int trap = trap_label(e); */
5057
	int r2;
5052
	int r2;
5058
	ans aa;
5053
	ans aa;
5059
	nsp = guardreg(r1,sp);
5054
	nsp = guardreg(r1,sp);
5060
	r2 = getreg(nsp.fixed);
5055
	r2 = getreg(nsp.fixed);
5061
	operate_fmt(i_subq,31,r1,r2);
5056
	operate_fmt(i_subq,31,r1,r2);
5062
	switch(name(sh(e))){
5057
	switch (name(sh(e))) {
5063
	  case ucharhd :{
5058
	  case ucharhd:{
5064
	    if(!optop(e)){
5059
	    if (!optop(e)) {
5065
	      if(error_treatment_is_trap(e)){
5060
	      if (error_treatment_is_trap(e)) {
5066
		test_unsigned_and_trap(r2,255,f_overflow);
5061
		test_unsigned_and_trap(r2,255,f_overflow);
5067
	      }
5062
	      }
5068
	      else{
5063
	      else{
5069
		test_unsigned(r2,255,trap_label(e));
5064
		test_unsigned(r2,255,trap_label(e));
5070
	      }
5065
	      }
5071
	    }
5066
	    }
5072
	    break;
5067
	    break;
5073
	  }
5068
	  }
5074
	  case scharhd :{
5069
	  case scharhd:{
5075
	    if(!optop(e)){
5070
	    if (!optop(e)) {
5076
	      if(error_treatment_is_trap(e)){
5071
	      if (error_treatment_is_trap(e)) {
5077
		test_signed_and_trap(r2,-128,127,f_overflow);
5072
		test_signed_and_trap(r2,-128,127,f_overflow);
5078
	      }
5073
	      }
5079
	      else{
5074
	      else{
5080
		test_signed(r2,-128,127,trap_label(e));
5075
		test_signed(r2,-128,127,trap_label(e));
5081
	      }
5076
	      }
5082
	    }
5077
	    }
5083
	    break;
5078
	    break;
5084
	  }
5079
	  }
5085
	  case uwordhd :{
5080
	  case uwordhd:{
5086
	    if(!optop(e)){
5081
	    if (!optop(e)) {
5087
	      if(error_treatment_is_trap(e)){
5082
	      if (error_treatment_is_trap(e)) {
5088
		test_unsigned_and_trap(r2,0xffff,f_overflow);
5083
		test_unsigned_and_trap(r2,0xffff,f_overflow);
5089
	      }
5084
	      }
5090
	      else{
5085
	      else{
5091
		test_unsigned(r2,0xffff,trap_label(e));
5086
		test_unsigned(r2,0xffff,trap_label(e));
5092
	      }
5087
	      }
5093
	    }
5088
	    }
5094
	    break;
5089
	    break;
5095
	  }
5090
	  }
5096
	  case swordhd : {
5091
	  case swordhd: {
5097
	    if(!optop(e)){
5092
	    if (!optop(e)) {
5098
	      if(error_treatment_is_trap(e)){
5093
	      if (error_treatment_is_trap(e)) {
5099
		test_signed_and_trap(r2,-0x8000L,0x7fff,f_overflow);
5094
		test_signed_and_trap(r2,-0x8000L,0x7fff,f_overflow);
5100
	      }
5095
	      }
5101
	      else{
5096
	      else{
5102
		test_signed(r2,-0x8000L,0x7fff,trap_label(e));
5097
		test_signed(r2,-0x8000L,0x7fff,trap_label(e));
5103
	      }
5098
	      }
5104
	    }
5099
	    }
5105
	    break;
5100
	    break;
5106
	  }
5101
	  }
5107
	  case ulonghd :{
5102
	  case ulonghd:{
5108
	    if(!optop(e)){
5103
	    if (!optop(e)) {
5109
	      if(error_treatment_is_trap(e)){
5104
	      if (error_treatment_is_trap(e)) {
5110
		test_unsigned_and_trap(r2,0xffffffff,f_overflow);
5105
		test_unsigned_and_trap(r2,0xffffffff,f_overflow);
5111
	      }
5106
	      }
5112
	      else{
5107
	      else{
5113
		test_unsigned(r2,0xffffffff,trap_label(e));
5108
		test_unsigned(r2,0xffffffff,trap_label(e));
5114
	      }
5109
	      }
5115
	    }
5110
	    }
5116
	    break;
5111
	    break;
5117
	  }
5112
	  }
5118
	  case slonghd :{
5113
	  case slonghd:{
5119
	    if(!optop(e)){
5114
	    if (!optop(e)) {
5120
	      if(error_treatment_is_trap(e)){
5115
	      if (error_treatment_is_trap(e)) {
5121
		test_signed_and_trap(r2,-0x80000000L,0x7fffffff,f_overflow);
5116
		test_signed_and_trap(r2,-0x80000000L,0x7fffffff,f_overflow);
5122
	      }
5117
	      }
5123
	      else{
5118
	      else{
5124
		test_signed(r2,-0x80000000L,0x7fffffff,trap_label(e));
5119
		test_signed(r2,-0x80000000L,0x7fffffff,trap_label(e));
5125
	      }
5120
	      }
5126
	    }
5121
	    }
5127
	    break;
5122
	    break;
5128
	  }
5123
	  }
5129
	  case s64hd :{
5124
	  case s64hd:{
5130
	    if(!optop(e)){
5125
	    if (!optop(e)) {
5131
	      if(error_treatment_is_trap(e)){
5126
	      if (error_treatment_is_trap(e)) {
5132
		test_unsigned_and_trap(r1,0x7fffffffffffffffL,f_overflow);
5127
		test_unsigned_and_trap(r1,0x7fffffffffffffffL,f_overflow);
5133
	      }
5128
	      }
5134
	      else{
5129
	      else{
5135
		test_unsigned(r1,0x7fffffffffffffffL,trap_label(e));
5130
		test_unsigned(r1,0x7fffffffffffffffL,trap_label(e));
5136
	      }
5131
	      }
5137
	    }
5132
	    }
5138
	    break;
5133
	    break;
5139
	  }
5134
	  }
5140
	  case u64hd :{
5135
	  case u64hd:{
5141
	    if(!optop(e)){
5136
	    if (!optop(e)) {
5142
	      if(error_treatment_is_trap(e)){
5137
	      if (error_treatment_is_trap(e)) {
5143
		int new_lab = new_label();
5138
		int new_lab = new_label();
5144
		integer_branch(i_ble,r1,new_lab);
5139
		integer_branch(i_ble,r1,new_lab);
5145
		do_exception(f_overflow);
5140
		do_exception(f_overflow);
5146
		set_label(new_lab);
5141
		set_label(new_lab);
5147
	      }
5142
	      }
Line 5149... Line 5144...
5149
		integer_branch(i_bgt,r1,trap_label(e));
5144
		integer_branch(i_bgt,r1,trap_label(e));
5150
	      }
5145
	      }
5151
	    }
5146
	    }
5152
	    break;
5147
	    break;
5153
	  }
5148
	  }
5154
	  
5149
 
5155
	  default:failer("Illegal shape in neg");
5150
	  default:failer("Illegal shape in neg");
5156
	}
5151
	}
5157
 
5152
 
5158
 
5153
 
5159
	setregalt(aa, r2);
5154
	setregalt(aa, r2);
5160
	mka.regmove = move(aa, dest, guardreg(r2, nsp), 0);
5155
	mka.regmove = move(aa, dest, guardreg(r2, nsp), 0);
5161
	return mka;
5156
	return mka;
5162
      }
5157
      }
5163
           
5158
 
5164
          
5159
 
5165
    } /* end neg */
5160
    } /* end neg */
5166
 
5161
 
5167
    case goto_lv_tag : {
5162
    case goto_lv_tag: {
5168
      int r = reg_operand(son(e),sp);
5163
      int r = reg_operand(son(e),sp);
5169
      integer_jump(i_jmp,31,r,0);
5164
      integer_jump(i_jmp,31,r,0);
5170
      clear_all();
5165
      clear_all();
5171
      return mka;
5166
      return mka;
5172
    }
5167
    }
5173
    case movecont_tag :{
5168
    case movecont_tag:{
5174
      exp szarg = bro(bro(son(e)));
5169
      exp szarg = bro(bro(son(e)));
5175
      int dr, sr, szr, mr;
5170
      int dr, sr, szr, mr;
5176
      int lout = new_label();
5171
      int lout = new_label();
5177
      space nsp;
5172
      space nsp;
5178
      int bytemove;
5173
      int bytemove;
5179
      where w;
5174
      where w;
5180
 
5175
 
5181
      sr = getreg(sp.fixed);
5176
      sr = getreg(sp.fixed);
5182
      setregalt(w.answhere, sr);
5177
      setregalt(w.answhere, sr);
5183
      w.ashwhere = ashof(sh(son(e)));
5178
      w.ashwhere = ashof(sh(son(e)));
5184
      (void) make_code(son(e), sp, w , 0);
5179
     (void)make_code(son(e), sp, w , 0);
5185
      nsp = guardreg(sr, sp);
5180
      nsp = guardreg(sr, sp);
5186
      dr = getreg(nsp.fixed);
5181
      dr = getreg(nsp.fixed);
5187
      setregalt(w.answhere, dr);
5182
      setregalt(w.answhere, dr);
5188
      (void)make_code(bro(son(e)), nsp, w, 0);
5183
     (void)make_code(bro(son(e)), nsp, w, 0);
5189
      nsp = guardreg(dr, nsp);
5184
      nsp = guardreg(dr, nsp);
5190
      w.ashwhere = ashof(sh(bro(bro(son(e)))));
5185
      w.ashwhere = ashof(sh(bro(bro(son(e)))));
5191
      szr = getreg(nsp.fixed);
5186
      szr = getreg(nsp.fixed);
5192
      setregalt(w.answhere, szr);
5187
      setregalt(w.answhere, szr);
5193
      (void)make_code(szarg, nsp, w, 0);
5188
     (void)make_code(szarg, nsp, w, 0);
5194
      nsp = guardreg(szr, nsp);
5189
      nsp = guardreg(szr, nsp);
5195
      mr = getreg(nsp.fixed);
5190
      mr = getreg(nsp.fixed);
5196
      bytemove = al2(sh(szarg))>>3;
5191
      bytemove = al2(sh(szarg)) >>3;
5197
 
5192
 
5198
      if(name(szarg) != val_tag || no(szarg) == 0) {
5193
      if (name(szarg)!= val_tag || no(szarg) == 0) {
5199
	integer_branch(i_beq,szr,lout);
5194
	integer_branch(i_beq,szr,lout);
5200
      } 
5195
      }
5201
      if (isnooverlap(e)) {
5196
      if (isnooverlap(e)) {
5202
	move_dlts(dr,sr,szr,mr, bytemove,sp);
5197
	move_dlts(dr,sr,szr,mr, bytemove,sp);
5203
      }
5198
      }
5204
      else {
5199
      else {
5205
	int gtlab = new_label();
5200
	int gtlab = new_label();
5206
	int rtmp=getreg(nsp.fixed);
5201
	int rtmp=getreg(nsp.fixed);
5207
	operate_fmt(i_cmple,dr,sr,rtmp);
5202
	operate_fmt(i_cmple,dr,sr,rtmp);
5208
	integer_branch(i_beq,rtmp,gtlab);
5203
	integer_branch(i_beq,rtmp,gtlab);
Line 5212... Line 5207...
5212
	move_dgts(dr,sr,szr, mr, bytemove,sp);
5207
	move_dgts(dr,sr,szr, mr, bytemove,sp);
5213
      }
5208
      }
5214
      set_label(lout);
5209
      set_label(lout);
5215
      return mka;
5210
      return mka;
5216
    }
5211
    }
5217
    case set_stack_limit_tag : {
5212
    case set_stack_limit_tag: {
5218
      int reg = reg_operand(son(e),sp);
5213
      int reg = reg_operand(son(e),sp);
5219
      baseoff b;
5214
      baseoff b;
5220
      /*      b = find_tag("__TDFstacklim");*/
5215
      /*      b = find_tag("__TDFstacklim");*/
5221
      b = find_tag("__alpha_stack_limit");
5216
      b = find_tag("__alpha_stack_limit");
5222
      load_store(i_stq,reg,b);
5217
      load_store(i_stq,reg,b);
5223
      return mka;
5218
      return mka;
5224
    }
5219
    }
5225
    case give_stack_limit_tag : {
5220
    case give_stack_limit_tag: {
5226
      ans aa;
5221
      ans aa;
5227
      baseoff b;
5222
      baseoff b;
5228
      int reg = regfrmdest(&dest,sp);
5223
      int reg = regfrmdest(&dest,sp);
5229
      /*      b = find_tag("__TDFstacklim");*/
5224
      /*      b = find_tag("__TDFstacklim");*/
5230
      b = find_tag("__alpha_stack_limit");
5225
      b = find_tag("__alpha_stack_limit");
5231
      load_store(i_ldq,reg,b);
5226
      load_store(i_ldq,reg,b);
5232
      setregalt(aa,reg);
5227
      setregalt(aa,reg);
5233
      move(aa,dest,guardreg(reg,sp),1);
5228
      move(aa,dest,guardreg(reg,sp),1);
5234
      return mka;
5229
      return mka;
5235
    }
5230
    }
5236
    case shl_tag : 
5231
    case shl_tag:
5237
    case shr_tag :{
5232
    case shr_tag:{
5238
      exp s = son (e);
5233
      exp s = son(e);
5239
      exp b = bro (s);
5234
      exp b = bro(s);
5240
      int a;
5235
      int a;
5241
      int d; 
5236
      int d;
5242
      int src_reg;
5237
      int src_reg;
5243
      ans aa;
5238
      ans aa;
5244
      space nsp;
5239
      space nsp;
5245
      bool sgned = is_signed(sh(e));
5240
      bool sgned = is_signed(sh(e));
5246
      instruction shnat;
5241
      instruction shnat;
5247
      instruction shun;
5242
      instruction shun;
5248
      a = reg_operand (s, sp);
5243
      a = reg_operand(s, sp);
5249
      /* choose which shift instruction */
5244
      /* choose which shift instruction */
5250
      if (name (e) == shr_tag) {
5245
      if (name(e) == shr_tag) {
5251
	shnat = (sgned) ? i_sra : i_srl;
5246
	shnat = (sgned)? i_sra : i_srl;
5252
	shun = i_sll;
5247
	shun = i_sll;
5253
      }
5248
      }
5254
      else {
5249
      else {
5255
	shnat = i_sll;
5250
	shnat = i_sll;
5256
	shun = (sgned) ? i_sra : i_srl;
5251
	shun = (sgned)? i_sra : i_srl;
5257
      }
5252
      }
5258
       
5253
 
5259
      nsp = guardreg (a, sp);
5254
      nsp = guardreg(a, sp);
5260
      d = regfrmdest(&dest, nsp);
5255
      d = regfrmdest(&dest, nsp);
5261
 
5256
 
5262
      /* when applying right shifts to unsigned data which is less then
5257
      /* when applying right shifts to unsigned data which is less then
5263
	 the full (64 bit) register length, we must ensure that all the 
5258
	 the full (64 bit) register length, we must ensure that all the
5264
	 unused bits in the upper part of the register are set to zero */
5259
	 unused bits in the upper part of the register are set to zero */
5265
     if(!is64(sh(son(e))) && !is_signed(sh(son(e))) 
5260
     if (!is64(sh(son(e))) && !is_signed(sh(son(e)))
5266
	 && ins_equal(i_srl,shnat)) {
5261
	 && ins_equal(i_srl,shnat)) {
5267
	src_reg = getreg(nsp.fixed);
5262
	src_reg = getreg(nsp.fixed);
5268
	if(name(sh(son(e))) == ulonghd)
5263
	if (name(sh(son(e))) == ulonghd)
5269
	  operate_fmt_immediate(i_zapnot,a,15,src_reg);
5264
	  operate_fmt_immediate(i_zapnot,a,15,src_reg);
5270
	else if(name(sh(son(e))) == uwordhd) 
5265
	else if (name(sh(son(e))) == uwordhd)
5271
	  operate_fmt_immediate(i_zapnot,a,3,src_reg);
5266
	  operate_fmt_immediate(i_zapnot,a,3,src_reg);
5272
	else if (name(sh(son(e))) == ucharhd)
5267
	else if (name(sh(son(e))) == ucharhd)
5273
	  operate_fmt_immediate(i_zapnot,a,1,src_reg);
5268
	  operate_fmt_immediate(i_zapnot,a,1,src_reg);
5274
      }
5269
      }
5275
      else {
5270
      else {
5276
	src_reg = a;
5271
	src_reg = a;
5277
      }
5272
      }
5278
      nsp = guardreg(src_reg,nsp);
5273
      nsp = guardreg(src_reg,nsp);
5279
      if (name (b) == val_tag) {
5274
      if (name(b) == val_tag) {
5280
	/* if its a constant shift we dont have to choose shift
5275
	/* if its a constant shift we dont have to choose shift
5281
	   dynamically ... */
5276
	   dynamically ... */
5282
	if (no (b) >= 0) {
5277
	if (no(b) >= 0) {
5283
#if 0
5278
#if 0
5284
	  if(!is64(sh(son(e))) && !is_signed(sh(son(e))) && 
5279
	  if (!is64(sh(son(e))) && !is_signed(sh(son(e))) &&
5285
	     ins_equal(i_srl,shnat)){
5280
	     ins_equal(i_srl,shnat)) {
5286
	    /* if quantity being shifted right is not 64 bits wide 
5281
	    /* if quantity being shifted right is not 64 bits wide
5287
	       then the top 32 bits of the register containing it
5282
	       then the top 32 bits of the register containing it
5288
	       must be set to zero.  This does not apply to 
5283
	       must be set to zero.  This does not apply to
5289
	       arithmetic shifts. */
5284
	       arithmetic shifts. */
5290
	    operate_fmt_immediate(i_zapnot,a,15,a);
5285
	    operate_fmt_immediate(i_zapnot,a,15,a);
5291
	  }
5286
	  }
5292
#endif
5287
#endif
5293
	  operate_fmt_immediate (shnat,src_reg, no (b),d);
5288
	  operate_fmt_immediate(shnat,src_reg, no(b),d);
5294
	}
5289
	}
5295
	else {
5290
	else {
5296
	  operate_fmt_immediate (shun,src_reg, -no (b),d);
5291
	  operate_fmt_immediate(shun,src_reg, -no(b),d);
5297
	}
5292
	}
5298
      }
5293
      }
5299
      else {
5294
      else {
5300
	int   sr = getreg (nsp.fixed);
5295
	int   sr = getreg(nsp.fixed);
5301
	int   ar = reg_operand (b, nsp);
5296
	int   ar = reg_operand(b, nsp);
5302
	if (!is_signed(sh(b))/* unsigned */
5297
	if (!is_signed(sh(b))/* unsigned */
5303
	    || (name (b) == and_tag && name (bro (son (b))) == val_tag
5298
	    || (name(b) == and_tag && name(bro(son(b))) == val_tag
5304
		&& no (bro (son (b))) > 0 && no (bro (son (b))) <= 31)
5299
		&& no(bro(son(b))) > 0 && no(bro(son(b))) <= 31)
5305
	    ) {			/* ... similarly in these cases */
5300
	    ) {			/* ... similarly in these cases */
5306
	  operate_fmt (shnat,src_reg, ar,d);
5301
	  operate_fmt(shnat,src_reg, ar,d);
5307
	}
5302
	}
5308
	else {		/* choose shift dynamically */
5303
	else {		/* choose shift dynamically */
5309
	  int   l = new_label ();
5304
	  int   l = new_label();
5310
	  int   endl = new_label ();
5305
	  int   endl = new_label();
5311
	  if(!is64(sh(son(e)))){
5306
	  if (!is64(sh(son(e)))) {
5312
	    operate_fmt_immediate(i_sll,src_reg,32,src_reg);
5307
	    operate_fmt_immediate(i_sll,src_reg,32,src_reg);
5313
	    operate_fmt_immediate(is_signed(sh(son(e)))?i_sra:i_srl,src_reg
5308
	    operate_fmt_immediate(is_signed(sh(son(e)))?i_sra:i_srl,src_reg
5314
				  ,32,src_reg);
5309
				  ,32,src_reg);
5315
	    /*operate_fmt_immediate(i_zap,a,240,a);*/	/* ?? */
5310
	    /*operate_fmt_immediate(i_zap,a,240,a);*/	/* ?? */
5316
	  }
5311
	  }
5317
	  integer_branch(i_bge,ar,l);
5312
	  integer_branch(i_bge,ar,l);
5318
	  operate_fmt(i_subq,31,ar,sr);
5313
	  operate_fmt(i_subq,31,ar,sr);
5319
	  operate_fmt(shun,src_reg, sr,d);
5314
	  operate_fmt(shun,src_reg, sr,d);
5320
	  integer_branch(i_br,31,endl);
5315
	  integer_branch(i_br,31,endl);
5321
	  set_label (l);
5316
	  set_label(l);
5322
	  operate_fmt (shnat,src_reg, ar,d);
5317
	  operate_fmt(shnat,src_reg, ar,d);
5323
	  set_label (endl);
5318
	  set_label(endl);
5324
	}
5319
	}
5325
      }
5320
      }
5326
      if(is32(sh(e)) && (name(e) == shl_tag) ){
5321
      if (is32(sh(e)) && (name(e) == shl_tag)) {
5327
	operate_fmt_immediate(i_addl,d,0,d);
5322
	operate_fmt_immediate(i_addl,d,0,d);
5328
      }
5323
      }
5329
      setregalt (aa, d);
5324
      setregalt(aa, d);
5330
      move (aa, dest, nsp, 1);
5325
      move(aa, dest, nsp, 1);
5331
      mka.regmove = d;
5326
      mka.regmove = d;
5332
      return mka;
5327
      return mka;
5333
    } /* end shl */
5328
    } /* end shl */
5334
#if 0
5329
#if 0
5335
    case mod_tag :{
5330
    case mod_tag:{
5336
      /* only applies to signed operands */
5331
      /* only applies to signed operands */
5337
      exp rop = bro (son (e));
5332
      exp rop = bro(son(e));
5338
      exp lop = son(e);
5333
      exp lop = son(e);
5339
      int ne = name(e);
5334
      int ne = name(e);
5340
      space nsp;
5335
      space nsp;
5341
      int r0, r1, r2;
5336
      int r0, r1, r2;
5342
      int lab, treg;
5337
      int lab, treg;
5343
      ans aa;
5338
      ans aa;
5344
			
5339
 
5345
      failer("mod_tag not implemented correctly");
5340
      failer("mod_tag not implemented correctly");
5346
      r1 = reg_operand(lop, sp);
5341
      r1 = reg_operand(lop, sp);
5347
      nsp = guardreg(r1, sp);
5342
      nsp = guardreg(r1, sp);
5348
      r2 = reg_operand(rop, nsp);
5343
      r2 = reg_operand(rop, nsp);
5349
	
5344
 
5350
      if (!optop(e)) {		/* test for (-inf)/-1 and /0 */
5345
      if (!optop(e)) {		/* test for (-inf)/-1 and /0 */
5351
	long over = new_label();
5346
	long over = new_label();
5352
	long trap = no (son (pt (e)));
5347
	long trap = no(son(pt(e)));
5353
	int rt = getreg(guardreg(r2,nsp).fixed);
5348
	int rt = getreg(guardreg(r2,nsp).fixed);
5354
	ans aa;	   
5349
	ans aa;
5355
	integer_branch(i_beq,r2,trap);
5350
	integer_branch(i_beq,r2,trap);
5356
	operate_fmt_immediate(i_cmpeq,r2,-1,rt);
5351
	operate_fmt_immediate(i_cmpeq,r2,-1,rt);
5357
	integer_branch(i_bne,r2,over);
5352
	integer_branch(i_bne,r2,over);
5358
	operate_fmt_big_immediate(i_cmpeq,r1,maxmin(sh(e)).mini,rt);
5353
	operate_fmt_big_immediate(i_cmpeq,r1,maxmin(sh(e)).mini,rt);
5359
	integer_branch(i_beq,rt,trap);
5354
	integer_branch(i_beq,rt,trap);
5360
	set_label(over);       
5355
	set_label(over);
5361
      }
5356
      }
5362
      r0 = regfrmdest(&dest, nsp);
5357
      r0 = regfrmdest(&dest, nsp);
5363
      failer("mod tag not implemented correctly");
5358
      failer("mod tag not implemented correctly");
5364
      /*	operate_fmt(i_rem, r0, r1, r2);*/
5359
      /*	operate_fmt(i_rem, r0, r1, r2);*/
5365
      treg= getreg(guardreg(r0, nsp).fixed);
5360
      treg= getreg(guardreg(r0, nsp).fixed);
5366
      lab = new_label();
5361
      lab = new_label();
5367
      /*	condri_ins(i_beq, r0, 0, lab);*/
5362
      /*	condri_ins(i_beq, r0, 0, lab);*/
5368
      operate_fmt(i_xor, treg, r0, r2);
5363
      operate_fmt(i_xor, treg, r0, r2);
5369
      /*	condri_ins(i_bge, treg, 0, lab);*/
5364
      /*	condri_ins(i_bge, treg, 0, lab);*/
5370
      operate_fmt(i_addq, r0, r0, r2);
5365
      operate_fmt(i_addq, r0, r0, r2);
5371
      set_label(lab);		
5366
      set_label(lab);
5372
      setregalt(aa, r0);
5367
      setregalt(aa, r0);
5373
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
5368
      mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
5374
      return mka;
5369
      return mka;
5375
    }    
5370
    }
5376
#endif     
5371
#endif
5377
      /* Remainder operations have the same effect on the registers 
5372
      /* Remainder operations have the same effect on the registers
5378
	 AT,23,24,25 and 27 as the division operations, 
5373
	 AT,23,24,25 and 27 as the division operations,
5379
	 so they must be treated in the same way.*/
5374
	 so they must be treated in the same way.*/
5380
    case mod_tag :
5375
    case mod_tag:
5381
    case rem0_tag :
5376
    case rem0_tag:
5382
    case rem2_tag :{
5377
    case rem2_tag:{
5383
      exp rop = bro (son (e));
5378
      exp rop = bro(son(e));
5384
      exp lop = son(e);
5379
      exp lop = son(e);
5385
      bool uns = !is_signed(sh(e));
5380
      bool uns = !is_signed(sh(e));
5386
      space nsp;
5381
      space nsp;
5387
      int r0,r1, r2;
5382
      int r0,r1, r2;
5388
      ans aa;	
5383
      ans aa;
5389
#if 0
5384
#if 0
5390
      int size=dest.ashwhere.ashsize;
5385
      int size=dest.ashwhere.ashsize;
5391
#endif
5386
#endif
5392
      nsp = sp;
5387
      nsp = sp;
5393
      if(name(rop)==val_tag){
5388
      if (name(rop) ==val_tag) {
5394
	/* if the second argument is a constant then we can 
5389
	/* if the second argument is a constant then we can
5395
	   replace the rem* instruction by either an and 
5390
	   replace the rem* instruction by either an and
5396
	   instruction, or an umulh and multiplication 
5391
	   instruction, or an umulh and multiplication
5397
	   followed by a subtraction */
5392
	   followed by a subtraction */
5398
	int r = reg_operand(son(e),sp);
5393
	int r = reg_operand(son(e),sp);
5399
	int m = no(rop);	/* value of constant */
5394
	int m = no(rop);	/* value of constant */
5400
	int rres = regfrmdest(&dest,sp);
5395
	int rres = regfrmdest(&dest,sp);
5401
	int rtmp = getreg(guardreg(rres,sp).fixed);
5396
	int rtmp = getreg(guardreg(rres,sp).fixed);
5402
 
5397
 
5403
	if(m>1 && ((m&(m-1))==0)){
5398
	if (m>1 && ((m& (m-1)) ==0)) {
5404
	  /* if the constant is a power of 2 then use an and */
5399
	  /* if the constant is a power of 2 then use an and */
5405
	  ans aa;
5400
	  ans aa;
5406
	  operate_fmt_immediate (i_and,r, no (rop) - 1,rres);
5401
	  operate_fmt_immediate(i_and,r, no(rop) - 1,rres);
5407
	  setregalt (aa, rres);
5402
	  setregalt(aa, rres);
5408
	  mka.regmove = move (aa, dest, guardreg (rres, sp), 1);
5403
	  mka.regmove = move(aa, dest, guardreg(rres, sp), 1);
5409
	  return mka;
5404
	  return mka;
5410
	}
5405
	}
5411
	else{
5406
	else{
5412
	  if(m!=1){
5407
	  if (m!=1) {
5413
	    if(use_umulh_for_div){
5408
	    if (use_umulh_for_div) {
5414
#if DO_NEW_DIVISION
5409
#if DO_NEW_DIVISION
5415
	      divide_by_constant(e,lop,rop,rtmp,nsp);
5410
	      divide_by_constant(e,lop,rop,rtmp,nsp);
5416
#else
5411
#else
5417
	      divide_by_constant(r,make_INT64(0,m),rtmp,guardreg(r,sp));
5412
	      divide_by_constant(r,make_INT64(0,m),rtmp,guardreg(r,sp));
5418
#endif
5413
#endif
5419
	    }
5414
	    }
5420
	    else{
5415
	    else{
5421
	      if(!optop(e) && (m == 0)) {
5416
	      if (!optop(e) && (m == 0)) {
5422
		if(error_treatment_is_trap(e)) {
5417
		if (error_treatment_is_trap(e)) {
5423
		  do_exception(f_overflow);
5418
		  do_exception(f_overflow);
5424
		}
5419
		}
5425
		else {
5420
		else {
5426
		  integer_branch(i_br,31,trap_label(e));
5421
		  integer_branch(i_br,31,trap_label(e));
5427
		}
5422
		}
Line 5440... Line 5435...
5440
	  mka.regmove = move(aa, dest, guardreg(rres,sp), 1);
5435
	  mka.regmove = move(aa, dest, guardreg(rres,sp), 1);
5441
	  return mka;
5436
	  return mka;
5442
	}
5437
	}
5443
      }
5438
      }
5444
 
5439
 
5445
      nsp.fixed |= ((1<<23)|(1<<24)|(1<<25)|(1<<27));
5440
      nsp.fixed |= ((1<<23) | (1<<24) | (1<<25) | (1<<27));
5446
      r1 = reg_operand(lop, nsp);
5441
      r1 = reg_operand(lop, nsp);
5447
      clear_reg(23);
5442
      clear_reg(23);
5448
      clear_reg(24);
5443
      clear_reg(24);
5449
      clear_reg(25);
5444
      clear_reg(25);
5450
      clear_reg(27);
5445
      clear_reg(27);
5451
      nsp = guardreg(r1, nsp);
5446
      nsp = guardreg(r1, nsp);
5452
      r2 = reg_operand(rop, nsp);
5447
      r2 = reg_operand(rop, nsp);
5453
		
5448
 
5454
      if (!optop(e)) {		/* test for (-inf)/-1 and /0 */
5449
      if (!optop(e)) {		/* test for (-inf)/-1 and /0 */
5455
	check_exception(e,nsp);
5450
	check_exception(e,nsp);
5456
      }
5451
      }
5457
      if ((r0 = regfrmdest(&dest, nsp)) == NO_REG) {
5452
      if ((r0 = regfrmdest(&dest, nsp)) == NO_REG) {
5458
	r0  = getreg(nsp.fixed);
5453
	r0  = getreg(nsp.fixed);
5459
      }
5454
      }
5460
      nsp = guardreg(r0,nsp);
5455
      nsp = guardreg(r0,nsp);
5461
      if(!optop(e)) {
5456
      if (!optop(e)) {
5462
	integer_branch(i_beq,r2,trap_label(e));
5457
	integer_branch(i_beq,r2,trap_label(e));
5463
      }
5458
      }
5464
      operate_fmt((uns)?((is64(sh(e)))?i_remqu : i_remlu):
5459
      operate_fmt((uns)?((is64(sh(e)))?i_remqu : i_remlu):
5465
		  ((is64(sh(e)))?i_remq : i_reml),r1,r2,r0);
5460
		 ((is64(sh(e)))?i_remq : i_reml),r1,r2,r0);
5466
#if 0      
5461
#if 0
5467
      operate_fmt((uns)?((size==32)?i_remlu:i_remqu):
5462
      operate_fmt((uns)?((size==32)?i_remlu:i_remqu):
5468
		  ((size==32)?i_reml:i_remq),
5463
		 ((size==32)?i_reml:i_remq),
5469
		  r1,r2,r0);
5464
		  r1,r2,r0);
5470
#endif
5465
#endif
5471
      if(name(e) == mod_tag){
5466
      if (name(e) == mod_tag) {
5472
	int res_neg = new_label();
5467
	int res_neg = new_label();
5473
	int exitlab = new_label();
5468
	int exitlab = new_label();
5474
	integer_branch(i_beq,r0,exitlab);
5469
	integer_branch(i_beq,r0,exitlab);
5475
	integer_branch(i_blt,r0,res_neg);
5470
	integer_branch(i_blt,r0,res_neg);
5476
	integer_branch(i_bge,r2,exitlab);
5471
	integer_branch(i_bge,r2,exitlab);
5477
#if 0
5472
#if 0
5478
	operate_fmt((size == 32)?i_addl:i_addq,r0,r2,r0);
5473
	operate_fmt((size == 32)?i_addl:i_addq,r0,r2,r0);
5479
#endif
5474
#endif
5480
	operate_fmt(is64(sh(e))?i_addq : i_addl,r0,r2,r0);
5475
	operate_fmt(is64(sh(e))?i_addq : i_addl,r0,r2,r0);
5481
	integer_branch(i_br,31,exitlab);
5476
	integer_branch(i_br,31,exitlab);
5482
	set_label(res_neg);
5477
	set_label(res_neg);
5483
	integer_branch(i_ble,r2,exitlab);
5478
	integer_branch(i_ble,r2,exitlab);
Line 5485... Line 5480...
5485
	operate_fmt((size == 32)?i_addl:i_addq,r0,r2,r0);
5480
	operate_fmt((size == 32)?i_addl:i_addq,r0,r2,r0);
5486
#endif
5481
#endif
5487
	operate_fmt(is64(sh(e))? i_addq : i_addl,r0,r2,r0);
5482
	operate_fmt(is64(sh(e))? i_addq : i_addl,r0,r2,r0);
5488
	set_label(exitlab);
5483
	set_label(exitlab);
5489
      }
5484
      }
5490
       
5485
 
5491
 
5486
 
5492
      setregalt(aa, r0);
5487
      setregalt(aa, r0);
5493
      if((r2 == 23) || (r2 == 24) || (r2 == 25) || (r2 == AT)){
5488
      if ((r2 == 23) || (r2 == 24) || (r2 == 25) || (r2 == AT)) {
5494
	clear_dep_reg(rop);
5489
	clear_dep_reg(rop);
5495
      }
5490
      }
5496
      if((r1 == 23) || (r1 == 24) || (r1 == 25) || (r1 == AT)){
5491
      if ((r1 == 23) || (r1 == 24) || (r1 == 25) || (r1 == AT)) {
5497
	clear_dep_reg(lop);
5492
	clear_dep_reg(lop);
5498
      }   
5493
      }
5499
      clear_reg(23);
5494
      clear_reg(23);
5500
      clear_reg(24);
5495
      clear_reg(24);
5501
      clear_reg(25);
5496
      clear_reg(25);
5502
      clear_reg(27);       
5497
      clear_reg(27);
5503
      mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
5498
      mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
5504
      return mka;
5499
      return mka;
5505
 
5500
 
5506
    } /* end mod */
5501
    } /* end mod */
5507
 
5502
 
5508
 
5503
 
5509
    case offset_pad_tag :{
5504
    case offset_pad_tag:{
5510
      int rdest = regfrmdest(&dest,sp);
5505
      int rdest = regfrmdest(&dest,sp);
5511
      int roff = reg_operand(son(e),sp);
5506
      int roff = reg_operand(son(e),sp);
5512
      ans aa;
5507
      ans aa;
5513
      if (al2(sh(son(e))) >= al2(sh(e))){
5508
      if (al2(sh(son(e))) >= al2(sh(e))) {
5514
	if (al2(sh(e))!=1 || al2(sh(son(e)))==1){
5509
	if (al2(sh(e))!=1 || al2(sh(son(e))) ==1) {
5515
	  e = son(e);
5510
	  e = son(e);
5516
	  goto tailrecurse;
5511
	  goto tailrecurse;
5517
	}
5512
	}
5518
	operate_fmt_immediate(i_sll,roff,3,rdest);
5513
	operate_fmt_immediate(i_sll,roff,3,rdest);
5519
      }
5514
      }
5520
      else{
5515
      else{
5521
	int al = (al2(sh(son(e)))==1)?al2(sh(e)):(al2(sh(e))/8);
5516
	int al = (al2(sh(son(e))) ==1)?al2(sh(e)):(al2(sh(e)) /8);
5522
	operate_fmt_immediate(i_addq,roff,al-1,rdest);
5517
	operate_fmt_immediate(i_addq,roff,al-1,rdest);
5523
	operate_fmt_immediate(i_and,rdest,-al,rdest);
5518
	operate_fmt_immediate(i_and,rdest,-al,rdest);
5524
	if(al2(sh(son(e))) == 1){
5519
	if (al2(sh(son(e))) == 1) {
5525
	  operate_fmt_immediate(i_sra,rdest,3,rdest);
5520
	  operate_fmt_immediate(i_sra,rdest,3,rdest);
5526
	}
5521
	}
5527
      }
5522
      }
5528
      setregalt(aa,rdest);
5523
      setregalt(aa,rdest);
5529
      mka.regmove = move(aa,dest,guardreg(rdest,sp),0);
5524
      mka.regmove = move(aa,dest,guardreg(rdest,sp),0);
5530
      return mka;
5525
      return mka;
5531
    }
5526
    }
5532
#ifdef make_stack_limit_tag       
5527
#ifdef make_stack_limit_tag
5533
    case make_stack_limit_tag :
5528
    case make_stack_limit_tag:
5534
#endif
5529
#endif
5535
    case minptr_tag :{
5530
    case minptr_tag:{
5536
      mka.regmove = non_comm_op (e, sp, dest, i_subq);
5531
      mka.regmove = non_comm_op(e, sp, dest, i_subq);
5537
      return mka;
5532
      return mka;
5538
    }
5533
    }
5539
    case abs_tag : {
5534
    case abs_tag: {
5540
      int arg = reg_operand(son(e),sp);
5535
      int arg = reg_operand(son(e),sp);
5541
      int rtmp = getreg(guardreg(arg,sp).fixed);
5536
      int rtmp = getreg(guardreg(arg,sp).fixed);
5542
      int destreg;
5537
      int destreg;
5543
      ans tmp;
5538
      ans tmp;
5544
      switch(dest.answhere.discrim){
5539
      switch (dest.answhere.discrim) {
5545
        case inreg :{
5540
        case inreg:{
5546
	  destreg = regalt(dest.answhere);
5541
	  destreg = regalt(dest.answhere);
5547
	  break;
5542
	  break;
5548
	}
5543
	}
5549
        default:{
5544
        default:{
5550
	  destreg = getreg(sp.fixed);
5545
	  destreg = getreg(sp.fixed);
5551
	  break;
5546
	  break;
5552
	}
5547
	}
5553
      }
5548
      }
5554
      if (destreg == NO_REG) destreg = getreg(sp.fixed);
5549
      if (destreg == NO_REG)destreg = getreg(sp.fixed);
5555
	    
5550
 
5556
      operate_fmt(i_bis,arg,arg,destreg);
5551
      operate_fmt(i_bis,arg,arg,destreg);
5557
      operate_fmt(i_subq,31,arg,rtmp);
5552
      operate_fmt(i_subq,31,arg,rtmp);
5558
      operate_fmt(i_cmovgt,rtmp,rtmp,destreg);
5553
      operate_fmt(i_cmovgt,rtmp,rtmp,destreg);
5559
      if(!optop(e) /*&& !error_treatment_is_trap(e)*/) {
5554
      if(!optop(e) /*&& !error_treatment_is_trap(e)*/) {
5560
	int rt = getreg(sp.fixed);
5555
	int rt = getreg(sp.fixed);
5561
	operate_fmt_big_immediate(i_subq,destreg,maxmin(sh(e)).maxi,rt);
5556
	operate_fmt_big_immediate(i_subq,destreg,maxmin(sh(e)).maxi,rt);
5562
	if(error_treatment_is_trap(e)){
5557
	if (error_treatment_is_trap(e)) {
5563
	  int newl = new_label();
5558
	  int newl = new_label();
5564
	  integer_branch(i_ble,rt,newl);
5559
	  integer_branch(i_ble,rt,newl);
5565
	  do_exception(f_overflow);
5560
	  do_exception(f_overflow);
5566
	  set_label(newl);
5561
	  set_label(newl);
5567
	}
5562
	}
Line 5571... Line 5566...
5571
      }
5566
      }
5572
      setregalt(tmp,destreg);
5567
      setregalt(tmp,destreg);
5573
      mka.regmove = move(tmp,dest,sp,1);
5568
      mka.regmove = move(tmp,dest,sp,1);
5574
      return mka;
5569
      return mka;
5575
    }
5570
    }
5576
    case fplus_tag :{
5571
    case fplus_tag:{
5577
      mka.regmove =
5572
      mka.regmove =
5578
	fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_addt : i_adds);
5573
	fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_addt : i_adds);
5579
      if((name(sh(e))!=shrealhd) && 
5574
      if ((name(sh(e))!=shrealhd) &&
5580
	 (fregalt(dest.answhere).type==IEEE_single) && 
5575
	(fregalt(dest.answhere).type==IEEE_single) &&
5581
	 dest.answhere.discrim==infreg){
5576
	 dest.answhere.discrim==infreg) {
5582
      }
5577
      }
5583
      if (!optop(e)) check_exception(e, sp);	  
5578
      if (!optop(e))check_exception(e, sp);
5584
      return mka;
5579
      return mka;
5585
    }
5580
    }
5586
 
5581
 
5587
    case fminus_tag :{
5582
    case fminus_tag:{
5588
      mka.regmove =
5583
      mka.regmove =
5589
	fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_subt : i_subs);
5584
	fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_subt : i_subs);
5590
      if (!optop(e)) check_exception(e,sp);	  
5585
      if (!optop(e))check_exception(e,sp);
5591
      return mka;
5586
      return mka;
5592
    }
5587
    }
5593
 
5588
 
5594
    case fmult_tag :{
5589
    case fmult_tag:{
5595
      instruction mult_ins;
5590
      instruction mult_ins;
5596
      mult_ins = (name(sh(e)) != shrealhd)?i_mult:i_muls;
5591
      mult_ins = (name(sh(e))!= shrealhd)?i_mult:i_muls;
5597
      mka.regmove = fop (e, sp, dest, mult_ins);
5592
      mka.regmove = fop(e, sp, dest, mult_ins);
5598
      if (!optop(e) && !error_treatment_is_trap(e)) check_exception(e,sp);
5593
      if (!optop(e) && !error_treatment_is_trap(e))check_exception(e,sp);
5599
      return mka;
5594
      return mka;
5600
    }
5595
    }
5601
 
5596
 
5602
    case fdiv_tag :{
5597
    case fdiv_tag:{
5603
      instruction div_ins;
5598
      instruction div_ins;
5604
      div_ins = (name(sh(e)) != shrealhd)?i_divt:i_divs;
5599
      div_ins = (name(sh(e))!= shrealhd)?i_divt:i_divs;
5605
      /*
5600
      /*
5606
	if(!optop(e)){
5601
	if(!optop(e)){
5607
	div_ins = (name(sh(e)) != shrealhd)?i_divtsu:i_divssu;
5602
	div_ins = (name(sh(e)) != shrealhd)?i_divtsu:i_divssu;
5608
	}
5603
	}
5609
	else{
5604
	else{
5610
	div_ins = (name(sh(e)) != shrealhd)?i_divt:i_divs;
5605
	div_ins = (name(sh(e)) != shrealhd)?i_divt:i_divs;
5611
	}
5606
	}
5612
	*/
5607
	*/
5613
      if(!optop(e) && !error_treatment_is_trap(e)){
5608
      if (!optop(e) && !error_treatment_is_trap(e)) {
5614
	int fr = freg_operand(bro(son(e)),sp);
5609
	int fr = freg_operand(bro(son(e)),sp);
5615
	float_branch(i_fbeq,fr,no(son(pt(e))));
5610
	float_branch(i_fbeq,fr,no(son(pt(e))));
5616
      }
5611
      }
5617
      mka.regmove = fop (e, sp, dest, div_ins);
5612
      mka.regmove = fop(e, sp, dest, div_ins);
5618
      if (!optop(e) && !error_treatment_is_trap(e)) check_exception(e,sp);	  
5613
      if (!optop(e) && !error_treatment_is_trap(e))check_exception(e,sp);
5619
      return mka;
5614
      return mka;
5620
    }
5615
    }
5621
      
5616
 
5622
    case fneg_tag : 
5617
    case fneg_tag:
5623
    case fabs_tag :{
5618
    case fabs_tag:{
5624
      instruction ins;
5619
      instruction ins;
5625
      freg fr;
5620
      freg fr;
5626
      int arg=freg_operand(son(e),sp);
5621
      int arg=freg_operand(son(e),sp);
5627
      if(name(e) == fneg_tag){
5622
      if (name(e) == fneg_tag) {
5628
	if(optop(e)) ins = (name(sh(e)) != shrealhd)?i_subt:i_subs;
5623
	if (optop(e))ins = (name(sh(e))!= shrealhd)?i_subt:i_subs;
5629
	else
5624
	else
5630
	  ins = (name(sh(e)) != shrealhd)?i_subtsu:i_subssu;
5625
	  ins = (name(sh(e))!= shrealhd)?i_subtsu:i_subssu;
5631
      }
5626
      }
5632
      else{
5627
      else{
5633
	ins = i_cpys;
5628
	ins = i_cpys;
5634
      }
5629
      }
5635
      switch(dest.answhere.discrim){
5630
      switch (dest.answhere.discrim) {
5636
	case infreg :{
5631
	case infreg:{
5637
	  fr=fregalt(dest.answhere);
5632
	  fr=fregalt(dest.answhere);
5638
	  float_op(ins,31,arg,fr.fr);
5633
	  float_op(ins,31,arg,fr.fr);
5639
	  break;
5634
	  break;
5640
	}
5635
	}
5641
	default :{
5636
	default :{
5642
	  ans tmp;
5637
	  ans tmp;
5643
	  fr.type=(dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5638
	  fr.type= (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5644
	  fr.fr=getfreg(sp.flt);
5639
	  fr.fr=getfreg(sp.flt);
5645
	  setfregalt(tmp,fr);
5640
	  setfregalt(tmp,fr);
5646
	  float_op(ins,31,arg,fr.fr);
5641
	  float_op(ins,31,arg,fr.fr);
5647
	  move(tmp,dest,sp,1);
5642
	  move(tmp,dest,sp,1);
5648
	}
5643
	}
5649
      }
5644
      }
5650
      if (!optop(e) && (name(e)==fneg_tag) && !error_treatment_is_trap(e)) 
5645
      if (!optop(e) && (name(e) ==fneg_tag) && !error_treatment_is_trap(e))
5651
	check_exception(e,sp);	
5646
	check_exception(e,sp);
5652
      mka.regmove=((fr.type==IEEE_double)? -(fr.fr+32):(fr.fr+32));
5647
      mka.regmove= ((fr.type==IEEE_double)? - (fr.fr+32):(fr.fr+32));
5653
      return mka;
5648
      return mka;
5654
    }
5649
    }
5655
      
5650
 
5656
    case float_tag : {
5651
    case float_tag: {
5657
      exp in = son (e);
5652
      exp in = son(e);
5658
      where w;
5653
      where w;
5659
      int r;
5654
      int r;
5660
      int   f
5655
      int   f
5661
	=     (dest.answhere.discrim == infreg) ? regalt (dest.answhere)
5656
	=    (dest.answhere.discrim == infreg)? regalt(dest.answhere)
5662
	:     getfreg (sp.flt);
5657
	:     getfreg(sp.flt);
5663
      freg frg;
5658
      freg frg;
5664
      ans aa;
5659
      ans aa;
5665
      ash ain;
5660
      ash ain;
5666
      bool quad;
5661
      bool quad;
5667
      ain = ashof (sh (in));
5662
      ain = ashof(sh(in));
5668
      quad = (ain.ashsize!=32);
5663
      quad = (ain.ashsize!=32);
5669
      frg.fr = f;
5664
      frg.fr = f;
5670
      frg.type = IEEE_single;
5665
      frg.type = IEEE_single;
5671
      if(ain.ashsize<32){
5666
      if (ain.ashsize<32) {
5672
	/* go via fixed point register for bytes and words */
5667
	/* go via fixed point register for bytes and words */
5673
	where tmp;
5668
	where tmp;
5674
	ans src;
5669
	ans src;
5675
	r=reg_operand(in,sp);
5670
	r=reg_operand(in,sp);
5676
	setregalt(tmp.answhere,r);
5671
	setregalt(tmp.answhere,r);
Line 5680... Line 5675...
5680
	frg.type=IEEE_double;
5675
	frg.type=IEEE_double;
5681
	setfregalt(tmp.answhere,frg);
5676
	setfregalt(tmp.answhere,frg);
5682
	move(src,tmp,sp,0);
5677
	move(src,tmp,sp,0);
5683
      }
5678
      }
5684
      else{
5679
      else{
5685
	switch(name(sh(in))){
5680
	switch (name(sh(in))) {
5686
	  case swordhd :
5681
	  case swordhd:
5687
	  case uwordhd :
5682
	  case uwordhd:
5688
	  case slonghd :
5683
	  case slonghd:
5689
	  case ulonghd :
5684
	  case ulonghd:
5690
	  case s64hd :
5685
	  case s64hd:
5691
	  case u64hd :{
5686
	  case u64hd:{
5692
	    freg load_reg;
5687
	    freg load_reg;
5693
	    load_reg.type = IEEE_double; /* so we load in an octaword */
5688
	    load_reg.type = IEEE_double; /* so we load in an octaword */
5694
	    load_reg.fr=f;
5689
	    load_reg.fr=f;
5695
	    setfregalt(w.answhere,load_reg);
5690
	    setfregalt(w.answhere,load_reg);
5696
	    w.ashwhere=ashof(sh(in));
5691
	    w.ashwhere=ashof(sh(in));
Line 5700... Line 5695...
5700
	  default:
5695
	  default:
5701
	  setfregalt(w.answhere,frg);
5696
	  setfregalt(w.answhere,frg);
5702
	  w.ashwhere = ashof(sh(in));
5697
	  w.ashwhere = ashof(sh(in));
5703
	  code_here(in,sp,w);
5698
	  code_here(in,sp,w);
5704
	  break;
5699
	  break;
5705
	}	
5700
	}
5706
      }
5701
      }
5707
      if(!quad){
5702
      if (!quad) {
5708
	float_convert(i_cvtlq,f,f);
5703
	float_convert(i_cvtlq,f,f);
5709
      }
5704
      }
5710
      float_convert((name(sh(e))==shrealhd)?i_cvtqs:i_cvtqt,f,f);
5705
      float_convert((name(sh(e)) ==shrealhd)?i_cvtqs:i_cvtqt,f,f);
5711
      if (name (sh (e)) != shrealhd) {
5706
      if (name(sh(e))!= shrealhd) {
5712
	frg.type = IEEE_double;
5707
	frg.type = IEEE_double;
5713
      }
5708
      }
5714
      setfregalt (aa, frg);
5709
      setfregalt(aa, frg);
5715
      move (aa, dest, sp, 1);
5710
      move(aa, dest, sp, 1);
5716
      if(name(sh(in))==u64hd||(name(sh(in))==ulonghd)){
5711
      if (name(sh(in)) ==u64hd|| (name(sh(in)) ==ulonghd)) {
5717
	fix_unsigned(frg,sp,name(sh(in)));
5712
	fix_unsigned(frg,sp,name(sh(in)));
5718
      }
5713
      }
5719
      mka.regmove = (frg.type==IEEE_double) ? -(f + 32) : (f + 32);
5714
      mka.regmove = (frg.type==IEEE_double)? - (f + 32):(f + 32);
5720
      return mka;
5715
      return mka;
5721
    }
5716
    }
5722
    case chfl_tag :{
5717
    case chfl_tag:{
5723
      int   to = name (sh (e));
5718
      int   to = name(sh(e));
5724
      int   from = name (sh (son (e)));
5719
      int   from = name(sh(son(e)));
5725
      bool dto = (to != shrealhd) ? 1 : 0;
5720
      bool dto = (to != shrealhd)? 1 : 0;
5726
      bool dfrom = (from != shrealhd) ? 1 : 0;
5721
      bool dfrom = (from != shrealhd)? 1 : 0;
5727
      if (!dto && !dfrom) {	/* no change in representation */
5722
      if (!dto && !dfrom) {	/* no change in representation */
5728
	return make_code (son (e), sp, dest, exitlab);
5723
	return make_code(son(e), sp, dest, exitlab);
5729
      }
5724
      }
5730
      else {
5725
      else {
5731
	freg frg;
5726
	freg frg;
5732
	ans aa;
5727
	ans aa;
5733
	where w;
5728
	where w;
5734
	if (dest.answhere.discrim == infreg) {
5729
	if (dest.answhere.discrim == infreg) {
5735
	  frg = fregalt (dest.answhere);
5730
	  frg = fregalt(dest.answhere);
5736
	}
5731
	}
5737
	else {
5732
	else {
5738
	  frg.fr = getfreg (sp.flt);
5733
	  frg.fr = getfreg(sp.flt);
5739
	}
5734
	}
5740
	if(dto)		/* was dfrom */
5735
	if(dto)		/* was dfrom */
5741
	  frg.type = IEEE_double;
5736
	  frg.type = IEEE_double;
5742
	else
5737
	else
5743
	  frg.type = IEEE_single;
5738
	  frg.type = IEEE_single;
5744
	setfregalt (aa, frg);
5739
	setfregalt(aa, frg);
5745
	w.answhere = aa;
5740
	w.answhere = aa;
5746
	w.ashwhere = ashof (sh (son (e)));
5741
	w.ashwhere = ashof(sh(son(e)));
5747
	code_here (son (e), sp, w);
5742
	code_here(son(e), sp, w);
5748
	if(dto)
5743
	if (dto)
5749
	  frg.type = IEEE_double;
5744
	  frg.type = IEEE_double;
5750
	else
5745
	else
5751
	  frg.type = IEEE_single;
5746
	  frg.type = IEEE_single;
5752
	if((!dto) && dfrom){
5747
	if ((!dto) && dfrom) {
5753
	  /* If converting from double to single then we 
5748
	  /* If converting from double to single then we
5754
	     need to use a conversion */
5749
	     need to use a conversion */
5755
	  float_convert(i_cvtts,frg.fr,frg.fr);
5750
	  float_convert(i_cvtts,frg.fr,frg.fr);
5756
	}
5751
	}
5757
	setfregalt (aa, frg);
5752
	setfregalt(aa, frg);
5758
	move (aa, dest, sp, 1);
5753
	move(aa, dest, sp, 1);
5759
	mka.regmove = (frg.type==IEEE_double)?-(frg.fr + 32):(frg.fr + 32);
5754
	mka.regmove = (frg.type==IEEE_double)?- (frg.fr + 32):(frg.fr + 32);
5760
	if (!optop(e) && !dto && !error_treatment_is_trap(e)) check_exception(e,sp);	  
5755
	if (!optop(e) && !dto && !error_treatment_is_trap(e))check_exception(e,sp);
5761
	return mka;
5756
	return mka;
5762
      }
5757
      }
5763
    }
5758
    }
5764
 
5759
 
5765
    case and_tag : {
5760
    case and_tag: {
5766
      if(use_andcomp && name(bro(son(e))) == not_tag){
5761
      if (use_andcomp && name(bro(son(e))) == not_tag) {
5767
	bro(son(e)) = son(bro(son(e)));
5762
	bro(son(e)) = son(bro(son(e)));
5768
	mka.regmove = comm_op (e,sp,dest,i_bic);
5763
	mka.regmove = comm_op(e,sp,dest,i_bic);
5769
      }
5764
      }
5770
      else if(use_andcomp && name(son(e)) == not_tag){
5765
      else if (use_andcomp && name(son(e)) == not_tag) {
5771
	exp tmp = copyexp(son(e));
5766
	exp tmp = copyexp(son(e));
5772
	son(e) = bro(son(e));
5767
	son(e) = bro(son(e));
5773
	bro(son(e)) = son(tmp);
5768
	bro(son(e)) = son(tmp);
5774
	/*retcell(tmp)*/;
5769
	/*retcell(tmp)*/;
5775
	mka.regmove = comm_op (e,sp,dest,i_bic);
5770
	mka.regmove = comm_op(e,sp,dest,i_bic);
5776
      }
5771
      }
5777
      else
5772
      else
5778
	mka.regmove = comm_op (e, sp, dest, i_and);
5773
	mka.regmove = comm_op(e, sp, dest, i_and);
5779
      return mka;
5774
      return mka;
5780
    }
5775
    }
5781
    case andcomp_tag :{
5776
    case andcomp_tag:{
5782
      mka.regmove = comm_op(e,sp,dest,i_bic);
5777
      mka.regmove = comm_op(e,sp,dest,i_bic);
5783
      return mka;
5778
      return mka;
5784
    }
5779
    }
5785
    case or_tag : {
5780
    case or_tag: {
5786
      mka.regmove = comm_op (e, sp, dest, i_bis);
5781
      mka.regmove = comm_op(e, sp, dest, i_bis);
5787
      return mka;
5782
      return mka;
5788
    }
5783
    }
5789
 
5784
 
5790
    case xor_tag :{
5785
    case xor_tag:{
5791
      mka.regmove = comm_op (e, sp, dest, i_xor);
5786
      mka.regmove = comm_op(e, sp, dest, i_xor);
5792
      return mka;
5787
      return mka;
5793
    }
5788
    }
5794
 
5789
 
5795
    case not_tag : {
5790
    case not_tag: {
5796
      int arg=reg_operand(son(e),sp);
5791
      int arg=reg_operand(son(e),sp);
5797
      switch(dest.answhere.discrim){
5792
      switch (dest.answhere.discrim) {
5798
	case inreg :{
5793
	case inreg:{
5799
	  int the_dest = regalt(dest.answhere);
5794
	  int the_dest = regalt(dest.answhere);
5800
	  operate_fmt(i_ornot,31,arg,the_dest);
5795
	  operate_fmt(i_ornot,31,arg,the_dest);
5801
	  break;
5796
	  break;
5802
	}
5797
	}
5803
	default:{
5798
	default:{
Line 5811... Line 5806...
5811
	  move(a,dest,nsp,is_signed(sh(e)));
5806
	  move(a,dest,nsp,is_signed(sh(e)));
5812
	}
5807
	}
5813
      }
5808
      }
5814
      return mka;
5809
      return mka;
5815
    }
5810
    }
5816
    case locptr_tag : {
5811
    case locptr_tag: {
5817
      int ptr = reg_operand(son(e),sp);
5812
      int ptr = reg_operand(son(e),sp);
5818
      int ansr = regfrmdest(&dest,sp);
5813
      int ansr = regfrmdest(&dest,sp);
5819
      baseoff b;
5814
      baseoff b;
5820
      ans aa;
5815
      ans aa;
5821
      b.base = ptr;
5816
      b.base = ptr;
Line 5823... Line 5818...
5823
      load_store(i_ldq,ansr,b);
5818
      load_store(i_ldq,ansr,b);
5824
      setregalt(aa,ansr);
5819
      setregalt(aa,ansr);
5825
      mka.regmove = move(aa,dest,guardreg(ansr,sp),0);
5820
      mka.regmove = move(aa,dest,guardreg(ansr,sp),0);
5826
      return mka;
5821
      return mka;
5827
    }
5822
    }
5828
  
5823
 
5829
    case cont_tag : 
5824
    case cont_tag:
5830
    case name_tag : 
5825
    case name_tag:
5831
    case field_tag : 
5826
    case field_tag:
5832
    case reff_tag : 
5827
    case reff_tag:
5833
    case addptr_tag : 
5828
    case addptr_tag:
5834
    case subptr_tag :  
5829
    case subptr_tag:
5835
    case contvol_tag : {
5830
    case contvol_tag: {
5836
      where w;
5831
      where w;
5837
      bool sgned;
5832
      bool sgned;
5838
      ash desper;
5833
      ash desper;
5839
      int dr=(dest.answhere.discrim == inreg)?dest.answhere.val.regans:NO_REG;
5834
      int dr= (dest.answhere.discrim == inreg)?dest.answhere.val.regans:NO_REG;
5840
      desper = ashof (sh (e));
5835
      desper = ashof(sh(e));
5841
 
5836
 
5842
      if (name (e) == contvol_tag) {
5837
      if (name(e) == contvol_tag) {
5843
	clear_all ();
5838
	clear_all();
5844
	/*setvolatile ();*/
5839
	/*setvolatile ();*/
5845
      }
5840
      }
5846
      clear_dep_reg(e);
5841
      clear_dep_reg(e);
5847
      
5842
 
5848
      w = locate (e, guardreg(dr,sp), sh (e), dr);
5843
      w = locate(e, guardreg(dr,sp), sh(e), dr);
5849
      /* 'address of argument */
5844
      /* 'address of argument */
5850
      /*sgned = ((w.ashwhere.ashsize >= 64) 
5845
      /*sgned = ((w.ashwhere.ashsize >= 64)
5851
	|| name (sh (e)) & 1) ? 1 : 0;*/
5846
	|| name (sh (e)) & 1) ? 1 : 0;*/
5852
      sgned = is_signed(sh(e));
5847
      sgned = is_signed(sh(e));
5853
      mka.regmove = move (w.answhere, dest, (guard (w, sp)), sgned);
5848
      mka.regmove = move(w.answhere, dest,(guard(w, sp)), sgned);
5854
      clear_dep_reg(e);
5849
      clear_dep_reg(e);
5855
      if (name (e) == contvol_tag) {
5850
      if (name(e) == contvol_tag) {
5856
	mka.regmove = NOREG;
5851
	mka.regmove = NOREG;
5857
	/* setnovolatile ();*/
5852
	/* setnovolatile ();*/
5858
      }
5853
      }
5859
      return mka;
5854
      return mka;
5860
    } /* end cont */
5855
    } /* end cont */
5861
 
5856
 
5862
#if (FBASE != 10)
5857
#if (FBASE != 10)
5863
    case real_tag :
5858
    case real_tag:
5864
#endif
5859
#endif
5865
    case string_tag :{
5860
    case string_tag:{
5866
      instore isa;
5861
      instore isa;
5867
      ans aa;
5862
      ans aa;
5868
      bool sgned = ((ashof (sh (e)).ashsize >= 32) || name (sh (e)) & 1) ? 1 : 0;
5863
      bool sgned = ((ashof(sh(e)).ashsize >= 32) || name(sh(e)) & 1)? 1 : 0;
5869
      if(name(e)==real_tag){
5864
      if (name(e) ==real_tag) {
5870
	bool is_denorm = is_denormal(e);
5865
	bool is_denorm = is_denormal(e);
5871
	if(is_fzero(flptnos[no(e)]) || (is_denorm && treat_denorm_specially)){
5866
	if (is_fzero(flptnos[no(e)]) || (is_denorm && treat_denorm_specially)) {
5872
	  freg frg;
5867
	  freg frg;
5873
	  frg.fr = 31;
5868
	  frg.fr = 31;
5874
	  frg.type = (shape_size(sh(e)) == 32)?IEEE_single:IEEE_double;
5869
	  frg.type = (shape_size(sh(e)) == 32)?IEEE_single:IEEE_double;
5875
	  setfregalt(aa,frg);
5870
	  setfregalt(aa,frg);
5876
	  mka.regmove = move(aa,dest,sp,sgned);
5871
	  mka.regmove = move(aa,dest,sp,sgned);
5877
	  if(is_denorm){
5872
	  if (is_denorm) {
5878
	    if(fail_with_denormal_constant){
5873
	    if (fail_with_denormal_constant) {
5879
	      failer("Denormalised constant encountered");
5874
	      failer("Denormalised constant encountered");
5880
	      exit(EXIT_FAILURE);
5875
	      exit(EXIT_FAILURE);
5881
	    }
5876
	    }
5882
	    alphawarn("Replaced IEEE denormal with 0.0!");
5877
	    alphawarn("Replaced IEEE denormal with 0.0!");
5883
	    comment("Replaced IEEE denormal with 0.0");
5878
	    comment("Replaced IEEE denormal with 0.0");
Line 5885... Line 5880...
5885
	  return mka;
5880
	  return mka;
5886
	}
5881
	}
5887
      }
5882
      }
5888
#if DO_SCHEDULE
5883
#if DO_SCHEDULE
5889
      start_new_capsule(false);
5884
      start_new_capsule(false);
5890
#endif       
5885
#endif
5891
      isa=evaluated(e,0);
5886
      isa=evaluated(e,0);
5892
      set_text_section();
5887
      set_text_section();
5893
#if DO_SCHEDULE
5888
#if DO_SCHEDULE
5894
      close_capsule();
5889
      close_capsule();
5895
#endif
5890
#endif
5896
      setinsalt(aa,isa);
5891
      setinsalt(aa,isa);
5897
      mka.regmove=move(aa,dest,sp,sgned);
5892
      mka.regmove=move(aa,dest,sp,sgned);
5898
      return mka;
5893
      return mka;
5899
    }
5894
    }
5900
#if (FBASE == 10)	/* now defunct */
5895
#if (FBASE == 10)	/* now defunct */
5901
    case real_tag :{
5896
    case real_tag:{
5902
      instore isa;
5897
      instore isa;
5903
      ans aa;
5898
      ans aa;
5904
      char *flt_string;	/* a string representing the real literal */
5899
      char *flt_string;	/* a string representing the real literal */
5905
      char *ld_ins;		
5900
      char *ld_ins;
5906
      freg fr;
5901
      freg fr;
5907
      int use_fzero;		/* set if value of real is 0.0 */
5902
      int use_fzero;		/* set if value of real is 0.0 */
5908
	
5903
 
5909
      bool sgned = ((ashof (sh (e)).ashsize >= 32) || name (sh (e)) & 1) ? 1 : 0;
5904
      bool sgned = ((ashof(sh(e)).ashsize >= 32) || name(sh(e)) & 1)? 1 : 0;
5910
      flt_string = floating_value(e);
5905
      flt_string = floating_value(e);
5911
      use_fzero = !strcmp(flt_string,"0.0");
5906
      use_fzero = !strcmp(flt_string,"0.0");
5912
      switch(dest.answhere.discrim){
5907
      switch (dest.answhere.discrim) {
5913
	case infreg :
5908
	case infreg:
5914
	fr.fr = regalt(dest.answhere);
5909
	fr.fr = regalt(dest.answhere);
5915
	fr.type = (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5910
	fr.type = (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5916
	break;
5911
	break;
5917
	case insomefreg :
5912
	case insomefreg:
5918
	if(!use_fzero){
5913
	if (!use_fzero) {
5919
	  fr.fr = getfreg(sp.flt);
5914
	  fr.fr = getfreg(sp.flt);
5920
	  fr.type = (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5915
	  fr.type = (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5921
	}
5916
	}
5922
	break;
5917
	break;
5923
	case notinreg :
5918
	case notinreg:
5924
	fr.fr=getfreg(sp.flt);
5919
	fr.fr=getfreg(sp.flt);
5925
	fr.type=(dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5920
	fr.type= (dest.ashwhere.ashsize==32)?IEEE_single:IEEE_double;
5926
	break;
5921
	break;
5927
	default:
5922
	default:
5928
	  failer("dubious target for real_tag ");
5923
	  failer("dubious target for real_tag ");
5929
	}
5924
	}
5930
      ld_ins = (fr.type==IEEE_single)?i_ldis:i_ldit;
5925
      ld_ins = (fr.type==IEEE_single)?i_ldis:i_ldit;
5931
      if(use_fzero){
5926
      if (use_fzero) {
5932
	if(dest.answhere.discrim==insomefreg){
5927
	if (dest.answhere.discrim==insomefreg) {
5933
	  *dest.answhere.val.somefregans.fr=31;
5928
	  *dest.answhere.val.somefregans.fr=31;
5934
	  return mka;
5929
	  return mka;
5935
	}
5930
	}
5936
	else
5931
	else
5937
	  float_op(i_cpys,31,31,fr.fr);
5932
	  float_op(i_cpys,31,31,fr.fr);
5938
      }
5933
      }
5939
      else
5934
      else
5940
	float_load_store_immediate(ld_ins,fr.fr,flt_string);
5935
	float_load_store_immediate(ld_ins,fr.fr,flt_string);
5941
      if(dest.answhere.discrim==insomefreg)
5936
      if (dest.answhere.discrim==insomefreg)
5942
	*dest.answhere.val.somefregans.fr = fr.fr;
5937
	*dest.answhere.val.somefregans.fr = fr.fr;
5943
      if(dest.answhere.discrim==notinreg){
5938
      if (dest.answhere.discrim==notinreg) {
5944
	/* put reg contents into memory */
5939
	/* put reg contents into memory */
5945
	ans src;
5940
	ans src;
5946
	setfregalt(src,fr);
5941
	setfregalt(src,fr);
5947
	mka.regmove=move(src,dest,sp,sgned);
5942
	mka.regmove=move(src,dest,sp,sgned);
5948
      }
5943
      }
5949
      return mka;
5944
      return mka;
5950
    } /* end eval */
5945
    } /* end eval */
5951
#endif /* (FBASE==10) */
5946
#endif /* (FBASE==10) */
5952
      
5947
 
5953
    case val_tag : {
5948
    case val_tag: {
5954
      if (no (e) == 0 && !isbigval(e)) {
5949
      if (no(e) == 0 && !isbigval(e)) {
5955
	goto null_tag_case;
5950
	goto null_tag_case;
5956
      }
5951
      }
5957
      else {
5952
      else {
5958
	ash a;
5953
	ash a;
5959
	a = ashof (sh (e));
5954
	a = ashof(sh(e));
5960
	switch(a.ashsize)	{
5955
	switch (a.ashsize)	{
5961
	  case 8 :{
5956
	  case 8:{
5962
	    low_INT64(constval) = no(e)&255;
5957
	    low_INT64(constval) = no(e) &255;
5963
	    if(is_signed(sh(e)))
5958
	    if (is_signed(sh(e)))
5964
	      low_INT64(constval) -= (low_INT64(constval)&128)<<1;
5959
	      low_INT64(constval) -= (low_INT64(constval) &128) <<1;
5965
	    break;
5960
	    break;
5966
	  }
5961
	  }
5967
	  case 32 :{
5962
	  case 32:{
5968
	    low_INT64(constval) = no(e);
5963
	    low_INT64(constval) = no(e);
5969
	  }
5964
	  }
5970
	  
5965
 
5971
#if 0	   
5966
#if 0
5972
	    if(is_signed(sh(e))){
5967
	    if (is_signed(sh(e))) {
5973
	      low_INT64(constval) = no(e);
5968
	      low_INT64(constval) = no(e);
5974
	    }
5969
	    }
5975
	    else{
5970
	    else{
5976
	      low_INT64(constval) = uno(e);
5971
	      low_INT64(constval) = uno(e);
5977
	    }
5972
	    }
5978
#endif
5973
#endif
5979
	    break;
5974
	    break;
5980
	  case 64 :{
5975
	  case 64:{
5981
	    int findex = no(e);
5976
	    int findex = no(e);
5982
	    int ov;
5977
	    int ov;
5983
	    if(isbigval(e)){
5978
	    if (isbigval(e)) {
5984
	      flt64 res;
5979
	      flt64 res;
5985
	      res = flt_to_f64(findex,is_signed(sh(e)),&ov);
5980
	      res = flt_to_f64(findex,is_signed(sh(e)),&ov);
5986
	      INT64_assign(constval, flt64_to_INT64(res));
5981
	      INT64_assign(constval, flt64_to_INT64(res));
5987
	    }
5982
	    }
5988
	    else low_INT64(constval) = no(e);
5983
	    else low_INT64(constval) = no(e);
5989
	    break;
5984
	    break;
5990
	  }
5985
	  }
5991
	  default:{
5986
	  default:{
5992
	    low_INT64(constval)  = no(e)&65535;
5987
	    low_INT64(constval) = no(e) &65535;
5993
	    if(is_signed(sh(e)))
5988
	    if (is_signed(sh(e)))
5994
	      low_INT64(constval)  -= (low_INT64(constval)&32768)<<1 ;
5989
	      low_INT64(constval) -= (low_INT64(constval) &32768) <<1;
5995
	    break;
5990
	    break;
5996
	  }
5991
	  }
5997
	}
5992
	}
5998
      
5993
 
5999
	goto moveconst;
5994
	goto moveconst;
6000
      }
5995
      }
6001
    }
5996
    }
6002
    case prof_tag :
5997
    case prof_tag:
6003
    case top_tag : {
5998
    case top_tag: {
6004
      return mka;
5999
      return mka;
6005
    }
6000
    }
6006
    case dump_tag : {
6001
    case dump_tag: {
6007
      int fxd = no(e);
6002
      int fxd = no(e);
6008
      int fld = no(pt(e));
6003
      int fld = no(pt(e));
6009
      int old_fixdone = fixdone;
6004
      int old_fixdone = fixdone;
6010
      int old_fltdone = fltdone;
6005
      int old_fltdone = fltdone;
6011
      int old_result_label = result_label;
6006
      int old_result_label = result_label;
6012
      exp l;
6007
      exp l;
6013
      result_label=0;
6008
      result_label=0;
6014
      dump_sregs(fxd, fld);
6009
      dump_sregs(fxd, fld);
6015
      if ((fxd &(1<<RA))) sp.fixed &= ~(1<<RA); 
6010
      if ((fxd & (1<<RA)))sp.fixed &= ~(1<<RA);
6016
      for(l=son(crt_proc); name(l)==ident_tag && isparam(l); ){
6011
      for (l=son(crt_proc); name(l) ==ident_tag && isparam(l);) {
6017
	/* move any pars still in registers which go into dump regs */
6012
	/* move any pars still in registers which go into dump regs */
6018
	int sr = props(son(l));
6013
	int sr = props(son(l));
6019
	int tr = no(l);
6014
	int tr = no(l);
6020
	if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
6015
	if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
6021
	  if ((props(l) & infreg_bits)!=0 && 
6016
	  if ((props(l) & infreg_bits)!=0 &&
6022
	      (fld &(1<<(sr))) !=0 ) {
6017
	     (fld & (1<< (sr)))!=0) {
6023
	    if (name(sh(son(l))) != shrealhd) {
6018
	    if (name(sh(son(l)))!= shrealhd) {
6024
	      float_op(i_cpys,tr,tr,sr);
6019
	      float_op(i_cpys,tr,tr,sr);
6025
	    }
6020
	    }
6026
	    else {
6021
	    else {
6027
	      float_op(i_cpys,tr,tr,sr);
6022
	      float_op(i_cpys,tr,tr,sr);
6028
	    }
6023
	    }
6029
	    sp.flt &= ~(1<<tr); /* release fpar reg */
6024
	    sp.flt &= ~(1<<tr); /* release fpar reg */
6030
	    no(l) = sr; props(son(l)) = tr;
6025
	    no(l) = sr; props(son(l)) = tr;
6031
	  }
6026
	  }
6032
	  else
6027
	  else
6033
	    if (((fxd & (1<<sr)) !=0) && (props(l) & inreg_bits) ) {
6028
	    if (((fxd & (1<<sr))!=0) && (props(l) & inreg_bits)) {
6034
	      operate_fmt(i_bis,tr,tr,sr);
6029
	      operate_fmt(i_bis,tr,tr,sr);
6035
	      sp.fixed &= ~(1<<tr); /* release par reg */
6030
	      sp.fixed &= ~(1<<tr); /* release par reg */
6036
	      no(l)=sr; props(son(l)) = tr;
6031
	      no(l) =sr; props(son(l)) = tr;
6037
	    }
6032
	    }
6038
	}
6033
	}
6039
	l = bro(son(l));
6034
	l = bro(son(l));
6040
	if (name(l)==dump_tag) l = son(l);
6035
	if (name(l) ==dump_tag)l = son(l);
6041
      }
6036
      }
6042
      code_here(son(e), sp, dest);
6037
      code_here(son(e), sp, dest);
6043
      for(l=son(crt_proc); name(l)==ident_tag && isparam(l); ){
6038
      for (l=son(crt_proc); name(l) ==ident_tag && isparam(l);) {
6044
	/* restore structure of moved pars */
6039
	/* restore structure of moved pars */
6045
	int sr = props(son(l));
6040
	int sr = props(son(l));
6046
	int tr = no(l);
6041
	int tr = no(l);
6047
	if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
6042
	if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
6048
	  if ((props(l) & infreg_bits)!=0 && 
6043
	  if ((props(l) & infreg_bits)!=0 &&
6049
	      (fld &(1<<(tr<<1))) !=0 ) {
6044
	     (fld & (1<< (tr<<1)))!=0) {
6050
	    no(l) = sr; props(son(l)) = tr;
6045
	    no(l) = sr; props(son(l)) = tr;
6051
	  }
6046
	  }
6052
	  else
6047
	  else
6053
	    if ((fxd & (1<<tr)) !=0 ) {
6048
	    if ((fxd & (1<<tr))!=0) {
6054
	      no(l)=sr; props(son(l)) = tr;
6049
	      no(l) =sr; props(son(l)) = tr;
6055
	    }
6050
	    }
6056
	}
6051
	}
6057
	l = bro(son(l));
6052
	l = bro(son(l));
6058
	if (name(l)==dump_tag) l = son(l);
6053
	if (name(l) ==dump_tag)l = son(l);
6059
      }        
6054
      }
6060
      if (name(sh(e)) != bothd) {
6055
      if (name(sh(e))!= bothd) {
6061
	restore_sregs(fxd, fld);
6056
	restore_sregs(fxd, fld);
6062
      }
6057
      }
6063
      fixdone = old_fixdone;
6058
      fixdone = old_fixdone;
6064
      fltdone = old_fltdone;
6059
      fltdone = old_fltdone;
6065
      result_label = old_result_label;
6060
      result_label = old_result_label;
6066
      return mka;
6061
      return mka;
6067
    }	
6062
    }
6068
 
6063
 
6069
    case env_size_tag : {
6064
    case env_size_tag: {
6070
      exp tg = son(son(e));
6065
      exp tg = son(son(e));
6071
      procrec *pr = &procrecs[no(son(tg))];
6066
      procrec *pr = &procrecs[no(son(tg))];
6072
      constval = (pr->frame_size+pr->callee_size) >> 3;
6067
      constval = (pr->frame_size+pr->callee_size) >> 3;
6073
      goto moveconst;
6068
      goto moveconst;
6074
    }
6069
    }
6075
    
6070
 
6076
    case general_proc_tag :
6071
    case general_proc_tag:
6077
    case proc_tag : {
6072
    case proc_tag: {
6078
      /* 
6073
      /*
6079
	 set up locals_offset, fixdump, floatdump, 
6074
	 set up locals_offset, fixdump, floatdump,
6080
	 frame_size, dumpstart
6075
	 frame_size, dumpstart
6081
	 dec stack  ; output frame and mask 
6076
	 dec stack  ; output frame and mask
6082
	 code here;
6077
	 code here;
6083
 
6078
 
6084
	 The standard stack layout for a make_proc is as follows:
6079
	 The standard stack layout for a make_proc is as follows:
6085
       
6080
 
6086
	 -------------------------------------  Bottom of env
6081
	 -------------------------------------  Bottom of env
6087
	 space for caller params to be passed on stack
6082
	 space for caller params to be passed on stack
6088
	 (If containing apply or apply_general)
6083
	 (If containing apply or apply_general)
6089
 
6084
 
6090
	 space for dumped s registers
6085
	 space for dumped s registers
Line 6093... Line 6088...
6093
	 -------------------------------------- Top of env
6088
	 -------------------------------------- Top of env
6094
	 remaining arguments (in callers frame)
6089
	 remaining arguments (in callers frame)
6095
 
6090
 
6096
 
6091
 
6097
	 for general procs the frame will be set up as follows:
6092
	 for general procs the frame will be set up as follows:
6098
       
6093
 
6099
	 ----------------------------  Bottom of callee env
6094
	 ----------------------------  Bottom of callee env
6100
	 extra caller parameters (If containing apply or apply_general)
6095
	 extra caller parameters (If containing apply or apply_general)
6101
	 callee parameters (1,2,,,,,) 
6096
	 callee parameters (1,2,,,,,)
6102
	 space for dumped s registers
6097
	 space for dumped s registers
6103
	 locals				
6098
	 locals
6104
	 caller local reg
6099
	 caller local reg
6105
	 callee local reg
6100
	 callee local reg
6106
	 callee top of stack
6101
	 callee top of stack
6107
	 caller frame pointer		
6102
	 caller frame pointer
6108
	 Up to 6 caller parameters
6103
	 Up to 6 caller parameters
6109
	 --------------------------- Top of callee env
6104
	 --------------------------- Top of callee env
6110
	 Any remaining caller parameters
6105
	 Any remaining caller parameters
6111
	 */
6106
	 */
6112
    
6107
 
6113
      procrec * pr = & procrecs[no(e)];			 
6108
      procrec * pr = & procrecs[no(e)];
6114
      needs * ndpr = & pr->needsproc;
6109
      needs * ndpr = & pr->needsproc;
6115
      long pprops = (ndpr->propsneeds);
6110
      long pprops = (ndpr->propsneeds);
6116
      bool leaf = (pprops & anyproccall) == 0; 
6111
      bool leaf = (pprops & anyproccall) == 0;
6117
      space tbd;
6112
      space tbd;
6118
      space pars;
6113
      space pars;
6119
      long st;
6114
      long st;
6120
      exp l;
6115
      exp l;
6121
      int i;
6116
      int i;
6122
      int has_va;
6117
      int has_va;
6123
      setframe_flags(e, leaf); 	
6118
      setframe_flags(e, leaf);
6124
      has_va = has_c_vararg(e) || ((name(e) == general_proc_tag) && 
6119
      has_va = has_c_vararg(e) || ((name(e) == general_proc_tag) &&
6125
				   (!Has_no_vcallers));
6120
				  (!Has_no_vcallers));
6126
      in_general_proc = ( name(e)==general_proc_tag );
6121
      in_general_proc = (name(e) ==general_proc_tag);
6127
      old_postludes = (postlude_chain*)NULL;
6122
      old_postludes = (postlude_chain*)NULL;
6128
      crt_proc = e;
6123
      crt_proc = e;
6129
      frame_size = pr->frame_size;
6124
      frame_size = pr->frame_size;
6130
      locals_offset = pr->locals_offset;
6125
      locals_offset = pr->locals_offset;
6131
      max_args = pr->max_args;
6126
      max_args = pr->max_args;
6132
      param_stack_space = (min(max_args,
6127
      param_stack_space = (min(max_args,
6133
			       (Has_no_vcallers)?6*PTR_SZ : 12*PTR_SZ))>>3;
6128
			      (Has_no_vcallers)?6*PTR_SZ : 12*PTR_SZ)) >>3;
6134
      arg_stack_space = min(pr->needsproc.numparams,
6129
      arg_stack_space = min(pr->needsproc.numparams,
6135
			    (has_va)?12*PTR_SZ : 6*PTR_SZ)>>3;
6130
			   (has_va)?12*PTR_SZ : 6*PTR_SZ) >>3;
6136
#if 0
6131
#if 0
6137
      if(pr->needsproc.numparams > 11 * PTR_SZ) {
6132
      if (pr->needsproc.numparams > 11 * PTR_SZ) {
6138
	arg_stack_space = 12*PTR_SZ;
6133
	arg_stack_space = 12*PTR_SZ;
6139
      }
6134
      }
6140
      else {
6135
      else {
6141
	arg_stack_space = max(pr->needsproc.numparams,
6136
	arg_stack_space = max(pr->needsproc.numparams,
6142
			      (Has_no_vcallers?6*PTR_SZ : 12*PTR_SZ));
6137
			     (Has_no_vcallers?6*PTR_SZ : 12*PTR_SZ));
6143
      }
6138
      }
6144
#endif      
6139
#endif
6145
 
6140
 
6146
      /* this doesn't actually waste much space, and simplifies matters 
6141
      /* this doesn't actually waste much space, and simplifies matters
6147
	 later */
6142
	 later */
6148
      if(name(e) == general_proc_tag /* || proc_has_gen_call(e)*/) {
6143
      if(name(e) == general_proc_tag /* || proc_has_gen_call(e)*/) {
6149
	int old_arg_count = arg_stack_space;
6144
	int old_arg_count = arg_stack_space;
6150
	arg_stack_space = ((has_va)?12*PTR_SZ : 6*PTR_SZ)>>3;
6145
	arg_stack_space = ((has_va)?12*PTR_SZ : 6*PTR_SZ) >>3;
6151
	if(arg_stack_space > old_arg_count)
6146
	if (arg_stack_space > old_arg_count)
6152
	  frame_size += ((arg_stack_space - old_arg_count)<<3);
6147
	  frame_size += ((arg_stack_space - old_arg_count) <<3);
6153
      }
6148
      }
6154
      
6149
 
6155
      /*
6150
      /*
6156
	param_stack_space contains the maximum number of bytes 
6151
	param_stack_space contains the maximum number of bytes
6157
	that will be required to save the registers used by this
6152
	that will be required to save the registers used by this
6158
	proc when passing parameters to other procedures.  As
6153
	proc when passing parameters to other procedures.  As
6159
	the space is actually allocated in the callee frame, this
6154
	the space is actually allocated in the callee frame, this
6160
	is only needed for apply_general_proc.  arg_stack_space
6155
	is only needed for apply_general_proc.  arg_stack_space
6161
	contains the number of arguments passed to this proc, 
6156
	contains the number of arguments passed to this proc,
6162
	and for which space must be reserved within the current
6157
	and for which space must be reserved within the current
6163
	frame. 
6158
	frame.
6164
	*/
6159
	*/
6165
      for(i=0;i<min(pr->needsproc.numparams>>6,NUM_PARAM_REGS);++i){
6160
      for (i=0;i<min(pr->needsproc.numparams>>6,NUM_PARAM_REGS);++i) {
6166
	sp = guardreg(FIRST_INT_ARG+i,sp);
6161
	sp = guardreg(FIRST_INT_ARG+i,sp);
6167
      }
6162
      }
6168
       
6163
 
6169
      paramsdumpstart = pr->paramsdumpstart;
6164
      paramsdumpstart = pr->paramsdumpstart;
6170
      /* the fixed point registers will be stored in the space 
6165
      /* the fixed point registers will be stored in the space
6171
	 starting from gpdumpstart */
6166
	 starting from gpdumpstart */
6172
      gpdumpstart = (has_va)?paramsdumpstart+384:paramsdumpstart;
6167
      gpdumpstart = (has_va)?paramsdumpstart+384:paramsdumpstart;
6173
      proc_has_vararg = (has_va)?1:0;
6168
      proc_has_vararg = (has_va)?1:0;
6174
      fixdump = pr->fixdump;
6169
      fixdump = pr->fixdump;
6175
      floatdump = pr->floatdump;
6170
      floatdump = pr->floatdump;
6176
      dumpstart = pr->dumpstart;
6171
      dumpstart = pr->dumpstart;
6177
      fldumpstart = pr->fldumpstart;
6172
      fldumpstart = pr->fldumpstart;
6178
      callee_size = pr->callee_size;
6173
      callee_size = pr->callee_size;
6179
      stack_top=(locals_offset>>3)-8;
6174
      stack_top= (locals_offset>>3) -8;
6180
       
6175
 
6181
 
6176
 
6182
      st = (frame_size+callee_size) >> 3;
6177
      st = (frame_size+callee_size) >> 3;
6183
      fixdone = fltdone = 0;	/* no s-regs have been dumped yet */
6178
      fixdone = fltdone = 0;	/* no s-regs have been dumped yet */
6184
	
6179
 
6185
	
6180
 
6186
      tbd.fixed = fixdump;
6181
      tbd.fixed = fixdump;
6187
      tbd.flt = floatdump;
6182
      tbd.flt = floatdump;
6188
	
6183
 
6189
      pars.fixed = (leaf)?0:(1<<RA); 
6184
      pars.fixed = (leaf)?0:(1<<RA);
6190
      pars.flt = 0;
6185
      pars.flt = 0;
6191
      for (l = son(e); name(l) == ident_tag && isparam(l) &&
6186
      for (l = son(e); name(l) == ident_tag && isparam(l) &&
6192
			 name(son(l))!=formal_callee_tag; l = bro(son(l))) {
6187
			 name(son(l))!=formal_callee_tag; l = bro(son(l))) {
6193
	if ((props(l) & infreg_bits)!= 0) {
6188
	if ((props(l) & infreg_bits)!= 0) {
6194
	  int n = props(son(l));
6189
	  int n = props(son(l));
6195
	  if (n != no(l) && n != 0) {
6190
	  if (n != no(l) && n != 0) {
6196
	    pars.flt |= (1<<no(l));
6191
	    pars.flt |= (1<<no(l));
6197
	  }
6192
	  }
6198
	}
6193
	}
6199
	else if ((props(l) & inreg_bits)!=0) {
6194
	else if ((props(l) & inreg_bits)!=0) {
6200
	  int n = props(son(l));
6195
	  int n = props(son(l));
6201
	  if (n != no(l) && n != 0) {
6196
	  if (n != no(l) && n != 0) {
6202
	    pars.fixed |= (1<<no(l));
6197
	    pars.fixed |= (1<<no(l));
6203
	  }
6198
	  }
6204
	}
6199
	}
6205
      }	
6200
      }
6206
	
6201
 
6207
      dump_opt(e, &tbd, &pars);
6202
      dump_opt(e, &tbd, &pars);
6208
      set_global_pointer();
6203
      set_global_pointer();
6209
 
6204
 
6210
      if (name(e)==general_proc_tag) {	
6205
      if (name(e) ==general_proc_tag) {
6211
	if (Has_vcallees) {
6206
	if (Has_vcallees) {
6212
	  baseoff b;
6207
	  baseoff b;
6213
	  b.base = FP;
6208
	  b.base = FP;
6214
	  b.offset = (-4 * PTR_SZ>>3) - arg_stack_space;
6209
	  b.offset = (-4 * PTR_SZ>>3) - arg_stack_space;
6215
	  load_store(i_stq, local_reg, b); 
6210
	  load_store(i_stq, local_reg, b);
6216
	  operate_fmt(i_bis,SP,SP,local_reg);
6211
	  operate_fmt(i_bis,SP,SP,local_reg);
6217
	  if(!leaf) {
6212
	  if (!leaf) {
6218
	    b.offset = (-3*PTR_SZ>>3) - arg_stack_space;
6213
	    b.offset = (-3*PTR_SZ>>3) - arg_stack_space;
6219
	    load_store(i_stq, local_reg, b);
6214
	    load_store(i_stq, local_reg, b);
6220
	  }
6215
	  }
6221
	}
6216
	}
6222
	else if (Has_fp && name(e)==general_proc_tag) {
6217
	else if (Has_fp && name(e) ==general_proc_tag) {
6223
	  operate_fmt_immediate(i_addq,SP, arg_stack_space+
6218
	  operate_fmt_immediate(i_addq,SP, arg_stack_space+
6224
				(callee_size>>3),FP);
6219
				(callee_size>>3),FP);
6225
	}
6220
	}
6226
#if DO_SCHEDULE
6221
#if DO_SCHEDULE
6227
	close_capsule();
6222
	close_capsule();
6228
	start_new_capsule(true);
6223
	start_new_capsule(true);
6229
#endif
6224
#endif
6230
	if(frame_size != 0 || callee_size!=0){
6225
	if (frame_size != 0 || callee_size!=0) {
6231
	  operate_fmt_immediate(i_subq,SP,(frame_size+callee_size)>>3,SP);
6226
	  operate_fmt_immediate(i_subq,SP,(frame_size+callee_size) >>3,SP);
6232
	}
6227
	}
6233
      }
6228
      }
6234
      else{
6229
      else{
6235
	if (st != 0) {
6230
	if (st != 0) {
6236
	  baseoff a;
6231
	  baseoff a;
6237
	  a.base = SP;
6232
	  a.base = SP;
6238
	  a.offset=-st;
6233
	  a.offset=-st;
6239
	  load_store(i_lda,SP,a);
6234
	  load_store(i_lda,SP,a);
6240
	}
6235
	}
6241
	setframe (st,0);
6236
	setframe(st,0);
6242
	/* I'm not sure that this is the right order for these -
6237
	/* I'm not sure that this is the right order for these -
6243
	   diagnostics ? */
6238
	   diagnostics ? */
6244
 
6239
 
6245
	setprologue(2);
6240
	setprologue(2);
6246
#if DO_SCHEDULE
6241
#if DO_SCHEDULE
Line 6249... Line 6244...
6249
#endif
6244
#endif
6250
	if (Has_fp) {
6245
	if (Has_fp) {
6251
	  baseoff b;
6246
	  baseoff b;
6252
	  b.base = SP;
6247
	  b.base = SP;
6253
#if 0
6248
#if 0
6254
	  b.offset = ((callee_size+frame_size)>>3)-
6249
	  b.offset = ((callee_size+frame_size) >>3) -
6255
	    arg_stack_space-(PTR_SZ>>3);
6250
	    arg_stack_space- (PTR_SZ>>3);
6256
#endif
6251
#endif
6257
	  b.offset = ((callee_size+frame_size-PTR_SZ)>>3) - 
6252
	  b.offset = ((callee_size+frame_size-PTR_SZ) >>3) -
6258
	    ((in_general_proc)?0:arg_stack_space);
6253
	   ((in_general_proc)?0:arg_stack_space);
6259
 
6254
 
6260
	  b.offset = ((callee_size+frame_size-PTR_SZ)>>3) - 
6255
	  b.offset = ((callee_size+frame_size-PTR_SZ) >>3) -
6261
	    (arg_stack_space);
6256
	   (arg_stack_space);
6262
 
6257
 
6263
	  load_store(i_stq,FP,b);
6258
	  load_store(i_stq,FP,b);
6264
	  operate_fmt_immediate(i_addq,SP,st,FP);
6259
	  operate_fmt_immediate(i_addq,SP,st,FP);
6265
	  /*operate_fmt(i_bis,SP,SP,FP);*/
6260
	  /*operate_fmt(i_bis,SP,SP,FP);*/
6266
	  if (Has_tos) {
6261
	  if (Has_tos) {
6267
	    b.base = FP;
6262
	    b.base = FP;
6268
	    b.offset = -((PTR_SZ>>3)*2)-(arg_stack_space);
6263
	    b.offset = - ((PTR_SZ>>3)*2) - (arg_stack_space);
6269
	    load_store(i_stq,SP,b);
6264
	    load_store(i_stq,SP,b);
6270
	  }
6265
	  }
6271
	}
6266
	}
6272
      }
6267
      }
6273
 
6268
 
6274
      if(proc_has_checkstack(e)){
6269
      if (proc_has_checkstack(e)) {
6275
	baseoff b;
6270
	baseoff b;
6276
	int rtmp = getreg(sp.fixed);
6271
	int rtmp = getreg(sp.fixed);
6277
	/*	b = find_tag("__TDFstacklim");*/
6272
	/*	b = find_tag("__TDFstacklim");*/
6278
	b = find_tag("__alpha_stack_limit");
6273
	b = find_tag("__alpha_stack_limit");
6279
	stackerr_lab = new_label();
6274
	stackerr_lab = new_label();
Line 6284... Line 6279...
6284
	setat();
6279
	setat();
6285
      }
6280
      }
6286
      else{
6281
      else{
6287
	stackerr_lab = 0;
6282
	stackerr_lab = 0;
6288
      }
6283
      }
6289
       
6284
 
6290
       
6285
 
6291
      if ((pprops & realresult_bit) != 0) {
6286
      if ((pprops & realresult_bit)!= 0) {
6292
	/* proc has real result */
6287
	/* proc has real result */
6293
 
6288
 
6294
	/* add an entry for complex result : returned in f0/f1 */
6289
	/* add an entry for complex result : returned in f0/f1 */
6295
 
6290
 
6296
	freg frg;
6291
	freg frg;
6297
	frg.fr = 0;
6292
	frg.fr = 0;
6298
	if(pprops & longrealresult_bit)
6293
	if (pprops & longrealresult_bit)
6299
	  frg.type = IEEE_double;
6294
	  frg.type = IEEE_double;
6300
	else
6295
	else
6301
	  frg.type = IEEE_single;
6296
	  frg.type = IEEE_single;
6302
	setfregalt (procans, frg);
6297
	setfregalt(procans, frg);
6303
      }
6298
      }
6304
      else if ((pprops & has_result_bit) != 0) {
6299
      else if ((pprops & has_result_bit)!= 0) {
6305
	/* proc has fixed pt result */
6300
	/* proc has fixed pt result */
6306
	setregalt (procans, RESULT_REG);
6301
	setregalt(procans, RESULT_REG);
6307
      }	
6302
      }
6308
      else {			/* proc has no result */
6303
      else {			/* proc has no result */
6309
	setregalt (procans, NO_REG);
6304
	setregalt(procans, NO_REG);
6310
      }	
6305
      }
6311
      result_label = 0;
6306
      result_label = 0;
6312
      aritherr_lab = 0;
6307
      aritherr_lab = 0;
6313
      /* fix up integers passed in registers */
6308
      /* fix up integers passed in registers */
6314
      for(l = son(e);name(l) == ident_tag && isparam(l);l=bro(son(l))){
6309
      for (l = son(e);name(l) == ident_tag && isparam(l);l=bro(son(l))) {
6315
	if(props(l) & inreg_bits){
6310
	if (props(l) & inreg_bits) {
6316
	  int n = props(son(l));
6311
	  int n = props(son(l));
6317
	  Assert((n>=FIRST_INT_ARG) && (n<=LAST_INT_ARG));
6312
	  Assert((n>=FIRST_INT_ARG) && (n<=LAST_INT_ARG));
6318
	  if(is32(sh(son(l)))) operate_fmt_immediate(i_addl,n,0,n);
6313
	  if (is32(sh(son(l))))operate_fmt_immediate(i_addl,n,0,n);
6319
	}
6314
	}
6320
      }
6315
      }
6321
      code_here (son(e), guardreg(RA,sp), nowhere);
6316
      code_here(son(e), guardreg(RA,sp), nowhere);
6322
      param_stack_space = arg_stack_space = sizecallers = 0;
6317
      param_stack_space = arg_stack_space = sizecallers = 0;
6323
      /* evaluate body of proc */
6318
      /* evaluate body of proc */
6324
      if(stackerr_lab){
6319
      if (stackerr_lab) {
6325
	set_label(stackerr_lab);
6320
	set_label(stackerr_lab);
6326
	operate_fmt_immediate(i_addq,SP,frame_size>>3,SP);
6321
	operate_fmt_immediate(i_addq,SP,frame_size>>3,SP);
6327
	do_exception(f_stack_overflow);
6322
	do_exception(f_stack_overflow);
6328
      }
6323
      }
6329
      if(aritherr_lab){
6324
      if (aritherr_lab) {
6330
	set_label(aritherr_lab);
6325
	set_label(aritherr_lab);
6331
	do_exception(f_overflow);
6326
	do_exception(f_overflow);
6332
      }
6327
      }
6333
      return mka;
6328
      return mka;
6334
    } /* end proc */
6329
    } /* end proc */
6335
 
6330
 
6336
    case alloca_tag : {
6331
    case alloca_tag: {
6337
      exp s = son(e);
6332
      exp s = son(e);
6338
      int r = regfrmdest(&dest, sp);
6333
      int r = regfrmdest(&dest, sp);
6339
      int rd;
6334
      int rd;
6340
      ans aa;
6335
      ans aa;
6341
      comment("alloca");
6336
      comment("alloca");
6342
      if(checkalloc(e)){
6337
      if (checkalloc(e)) {
6343
	rd = getreg(sp.fixed);
6338
	rd = getreg(sp.fixed);
6344
	operate_fmt(i_bis,SP,SP,rd);
6339
	operate_fmt(i_bis,SP,SP,rd);
6345
      }
6340
      }
6346
      else{
6341
      else{
6347
	rd = SP;
6342
	rd = SP;
6348
      }
6343
      }
6349
      if (name(s)==val_tag) {
6344
      if (name(s) ==val_tag) {
6350
	operate_fmt_immediate(i_subq, rd,(no(s)+7 )&~7,rd);
6345
	operate_fmt_immediate(i_subq, rd,(no(s) +7) &~7,rd);
6351
      }
6346
      }
6352
      else {  
6347
      else {
6353
	int tmp = getreg(sp.fixed);
6348
	int tmp = getreg(sp.fixed);
6354
	int rop = reg_operand(s,sp);
6349
	int rop = reg_operand(s,sp);
6355
	operate_fmt_immediate(i_addq,rop,7,tmp);
6350
	operate_fmt_immediate(i_addq,rop,7,tmp);
6356
	operate_fmt_immediate(i_bic,tmp,7,tmp);
6351
	operate_fmt_immediate(i_bic,tmp,7,tmp);
6357
	operate_fmt(i_subq,rd,tmp,rd);
6352
	operate_fmt(i_subq,rd,tmp,rd);
6358
      }
6353
      }
6359
      if(checkalloc(e)){
6354
      if (checkalloc(e)) {
6360
	int rt = getreg(sp.fixed);
6355
	int rt = getreg(sp.fixed);
6361
	baseoff b;
6356
	baseoff b;
6362
	b = find_tag("__alpha_stack_limit");
6357
	b = find_tag("__alpha_stack_limit");
6363
	load_store(i_ldq,rt,b);
6358
	load_store(i_ldq,rt,b);
6364
	setnoat();
6359
	setnoat();
6365
	operate_fmt(i_cmple,rt,SP,AT);
6360
	operate_fmt(i_cmple,rt,SP,AT);
6366
	if(stackerr_lab == 0) stackerr_lab = new_label();
6361
	if (stackerr_lab == 0)stackerr_lab = new_label();
6367
	integer_branch(i_beq,AT,stackerr_lab);
6362
	integer_branch(i_beq,AT,stackerr_lab);
6368
	setat();
6363
	setat();
6369
	operate_fmt(i_bis,rd,rd,SP);
6364
	operate_fmt(i_bis,rd,rd,SP);
6370
      }
6365
      }
6371
      
6366
 
6372
      reset_tos();
6367
      reset_tos();
6373
      operate_fmt_immediate(i_addq,SP,max(0,(max_args-6*(PTR_SZ))>>3),r);
6368
      operate_fmt_immediate(i_addq,SP,max(0,(max_args-6*(PTR_SZ)) >>3),r);
6374
      /*operate_fmt(i_bis,SP,SP,r);*/
6369
      /*operate_fmt(i_bis,SP,SP,r);*/
6375
      setregalt(aa, r);
6370
      setregalt(aa, r);
6376
      mka.regmove = move(aa, dest, sp, 1);
6371
      mka.regmove = move(aa, dest, sp, 1);
6377
      return mka;
6372
      return mka;
6378
    }
6373
    }
6379
    
6374
 
6380
    case last_local_tag : {
6375
    case last_local_tag: {
6381
      int r = regfrmdest(&dest, sp);
6376
      int r = regfrmdest(&dest, sp);
6382
      ans aa;
6377
      ans aa;
6383
      /*operate_fmt_immediate(i_addq,SP,max_args>>3,r);*/
6378
      /*operate_fmt_immediate(i_addq,SP,max_args>>3,r);*/
6384
      operate_fmt(i_bis,SP,SP,r);
6379
      operate_fmt(i_bis,SP,SP,r);
6385
      setregalt(aa, r);
6380
      setregalt(aa, r);
6386
      mka.regmove = move(aa, dest, sp, 1);
6381
      mka.regmove = move(aa, dest, sp, 1);
6387
      return mka;
6382
      return mka;
6388
    }
6383
    }
6389
    
6384
 
6390
    case local_free_tag : {
6385
    case local_free_tag: {
6391
      exp s = son(e);
6386
      exp s = son(e);
6392
      int r = reg_operand(s, sp);
6387
      int r = reg_operand(s, sp);
6393
      exp off = bro(s);
6388
      exp off = bro(s);
6394
      comment("local_free_tag");
6389
      comment("local_free_tag");
6395
      if(name(off) == val_tag){
6390
      if (name(off) == val_tag) {
6396
	operate_fmt_immediate(i_addq, r, ((no(off)>>3)+7 )&~7,r);
6391
	operate_fmt_immediate(i_addq, r,((no(off) >>3) +7) &~7,r);
6397
      }
6392
      }
6398
      else{
6393
      else{
6399
	int rtmp = reg_operand(off,guardreg(r,sp));
6394
	int rtmp = reg_operand(off,guardreg(r,sp));
6400
	operate_fmt_immediate(i_addq,rtmp,7,rtmp);
6395
	operate_fmt_immediate(i_addq,rtmp,7,rtmp);
6401
	operate_fmt_immediate(i_bic,rtmp,7,rtmp);
6396
	operate_fmt_immediate(i_bic,rtmp,7,rtmp);
6402
	operate_fmt(i_addq,r,rtmp,r);
6397
	operate_fmt(i_addq,r,rtmp,r);
6403
      }
6398
      }
6404
      if(Has_fp){
6399
      if (Has_fp) {
6405
	/*operate_fmt_immediate(i_subq,r,max_args>>3,SP);*/
6400
	/*operate_fmt_immediate(i_subq,r,max_args>>3,SP);*/
6406
	operate_fmt(i_bis,r,r,SP);
6401
	operate_fmt(i_bis,r,r,SP);
6407
	reset_tos();
6402
	reset_tos();
6408
      }
6403
      }
6409
      return mka;
6404
      return mka;
6410
    }
6405
    }
6411
    
6406
 
6412
    case local_free_all_tag : {
6407
    case local_free_all_tag: {
6413
      if (Has_fp) {
6408
      if (Has_fp) {
6414
	operate_fmt_immediate(i_subq,FP,(frame_size+callee_size)>>3,SP);
6409
	operate_fmt_immediate(i_subq,FP,(frame_size+callee_size) >>3,SP);
6415
	reset_tos();
6410
	reset_tos();
6416
      }
6411
      }
6417
      return mka;
6412
      return mka;
6418
    }        	    	    	    	
-
 
6419
    		
6413
    }
-
 
6414
 
6420
    case current_env_tag : {
6415
    case current_env_tag: {
6421
      int r = regfrmdest(&dest, sp);
6416
      int r = regfrmdest(&dest, sp);
6422
      ans aa;
6417
      ans aa;
6423
      if (Has_fp) {
6418
      if (Has_fp) {
6424
	operate_fmt(i_bis,FP,FP,r);
6419
	operate_fmt(i_bis,FP,FP,r);
6425
      }
6420
      }
6426
      else {
6421
      else {
6427
	operate_fmt_immediate(i_addq, SP, (frame_size+callee_size)>>3,r);
6422
	operate_fmt_immediate(i_addq, SP,(frame_size+callee_size) >>3,r);
6428
      }
6423
      }
6429
      setregalt(aa, r);
6424
      setregalt(aa, r);
6430
      mka.regmove = move(aa, dest, sp, 1);
6425
      mka.regmove = move(aa, dest, sp, 1);
6431
      return mka;
6426
      return mka;
6432
    } 
6427
    }
6433
    case general_env_offset_tag :
6428
    case general_env_offset_tag:
6434
    case env_offset_tag : {
6429
    case env_offset_tag: {
6435
      low_INT64(constval) = frame_offset(son(e));
6430
      low_INT64(constval) = frame_offset(son(e));
6436
      goto moveconst;
6431
      goto moveconst;
6437
    }   	
6432
    }
6438
    	    	
6433
 
6439
    case null_tag : 
6434
    case null_tag:
6440
null_tag_case : {
6435
null_tag_case : {
6441
      ans aa;
6436
      ans aa;
6442
      setregalt (aa, 31);
6437
      setregalt(aa, 31);
6443
      mka.regmove = move (aa, dest, sp, 1);
6438
      mka.regmove = move(aa, dest, sp, 1);
6444
      return mka;
6439
      return mka;
6445
    }
6440
    }
6446
 
6441
 
6447
    case round_tag :{
6442
    case round_tag:{
6448
      int   r = (dest.answhere.discrim == inreg) ? regalt (dest.answhere)
6443
      int   r = (dest.answhere.discrim == inreg)? regalt(dest.answhere)
6449
	:getreg (sp.fixed);
6444
	:getreg(sp.fixed);
6450
      int   sfr = freg_operand (son (e), sp);
6445
      int   sfr = freg_operand(son(e), sp);
6451
      int   dfr = getfreg (guardfreg (sfr, sp).flt);
6446
      int   dfr = getfreg(guardfreg(sfr, sp).flt);
6452
      ash a;
6447
      ash a;
6453
      ans aa;
6448
      ans aa;
6454
      int   s;
6449
      int   s;
6455
      instruction ins;
6450
      instruction ins;
6456
      int truncate = (round_number(e)!=f_to_nearest);
6451
      int truncate = (round_number(e)!=f_to_nearest);
6457
      a = ashof (sh (son (e)));
6452
      a = ashof(sh(son(e)));
6458
      s = a.ashsize;
6453
      s = a.ashsize;
6459
      if(r == NO_REG) {
6454
      if (r == NO_REG) {
6460
	Assert(!optop(e));
6455
	Assert(!optop(e));
6461
	r = getreg(sp.fixed);
6456
	r = getreg(sp.fixed);
6462
      }
6457
      }
6463
      	
6458
 
6464
      /* start of round */
6459
      /* start of round */
6465
      /* simply do a conversion: double->long or float->int */
6460
      /* simply do a conversion: double->long or float->int */
6466
      /* need to check FPCR for possible [over/under]flow */
6461
      /* need to check FPCR for possible [over/under]flow */
6467
      ins = (truncate)?i_cvttqc:i_cvttq;
6462
      ins = (truncate)?i_cvttqc:i_cvttq;
6468
      if(round_number(e) == f_toward_zero){
6463
      if (round_number(e) == f_toward_zero) {
6469
	ins = i_cvttqc;
6464
	ins = i_cvttqc;
6470
      }
6465
      }
6471
      else if (round_number(e) == f_toward_smaller){
6466
      else if (round_number(e) == f_toward_smaller) {
6472
	ins = i_cvttqm;
6467
	ins = i_cvttqm;
6473
      }
6468
      }
6474
      else if (round_number(e) == f_toward_larger){
6469
      else if (round_number(e) == f_toward_larger) {
6475
	set_up_rounding_mode(PLUS_INFINITY);
6470
	set_up_rounding_mode(PLUS_INFINITY);
6476
	ins = i_cvttqd;
6471
	ins = i_cvttqd;
6477
      }
6472
      }
6478
      else{
6473
      else{
6479
	ins = i_cvttq;
6474
	ins = i_cvttq;
6480
      }
6475
      }
6481
       	 
6476
 
6482
      float_convert(ins,sfr,dfr); /* convert to integer QW */
6477
      float_convert(ins,sfr,dfr); /* convert to integer QW */
6483
      /* now move the result into register r */
6478
      /* now move the result into register r */
6484
      {
6479
      {
6485
	ans source;
6480
	ans source;
6486
	where d;
6481
	where d;
6487
	freg fr;
6482
	freg fr;
6488
	fr.fr=dfr;
6483
	fr.fr=dfr;
6489
	fr.type=(s==32)?IEEE_single:IEEE_double;
6484
	fr.type= (s==32)?IEEE_single:IEEE_double;
6490
	setfregalt(source,fr);
6485
	setfregalt(source,fr);
6491
	setregalt(d.answhere,r);
6486
	setregalt(d.answhere,r);
6492
	d.ashwhere=a;
6487
	d.ashwhere=a;
6493
	move(source,d,sp,0);
6488
	move(source,d,sp,0);
6494
      }
6489
      }
6495
	
6490
 
6496
      /* we may have to cope with overflow a la C */
6491
      /* we may have to cope with overflow a la C */
6497
      if (name (sh (e)) == ucharhd) {
6492
      if (name(sh(e)) == ucharhd) {
6498
	if(!optop(e) && !error_treatment_is_trap(e)){
6493
	if (!optop(e) && !error_treatment_is_trap(e)) {
6499
	  test_unsigned(r,255,trap_label(e));
6494
	  test_unsigned(r,255,trap_label(e));
6500
	}
6495
	}
6501
	else if (error_treatment_is_trap(e)){
6496
	else if (error_treatment_is_trap(e)) {
6502
	  test_unsigned_and_trap(r,255,f_overflow);
6497
	  test_unsigned_and_trap(r,255,f_overflow);
6503
	}
6498
	}
6504
	operate_fmt_immediate (i_and, r, 255,r);
6499
	operate_fmt_immediate(i_and, r, 255,r);
6505
      }
6500
      }
6506
      else if (name (sh (e)) == uwordhd) {
6501
      else if (name(sh(e)) == uwordhd) {
6507
	if(!optop(e) && !error_treatment_is_trap(e)){
6502
	if (!optop(e) && !error_treatment_is_trap(e)) {
6508
	  test_unsigned(r,0xffff,trap_label(e));
6503
	  test_unsigned(r,0xffff,trap_label(e));
6509
	}
6504
	}
6510
	else if(error_treatment_is_trap(e)){
6505
	else if (error_treatment_is_trap(e)) {
6511
	  test_unsigned_and_trap(r,0xffff,f_overflow);
6506
	  test_unsigned_and_trap(r,0xffff,f_overflow);
6512
	}
6507
	}
6513
	operate_fmt_immediate (i_and, r,(1 << 16) - 1,r);
6508
	operate_fmt_immediate(i_and, r,(1 << 16) - 1,r);
6514
      }
6509
      }
6515
      else if (name (sh (e)) == scharhd) {
6510
      else if (name(sh(e)) == scharhd) {
6516
	if(!optop(e) && !error_treatment_is_trap(e)){
6511
	if (!optop(e) && !error_treatment_is_trap(e)) {
6517
	  test_signed(r,-128,127,trap_label(e));
6512
	  test_signed(r,-128,127,trap_label(e));
6518
	}
6513
	}
6519
	else if (error_treatment_is_trap(e)){
6514
	else if (error_treatment_is_trap(e)) {
6520
	  test_signed_and_trap(r,-128,127,f_overflow);
6515
	  test_signed_and_trap(r,-128,127,f_overflow);
6521
	}
6516
	}
6522
	operate_fmt_immediate (i_sll, r,56, r);
6517
	operate_fmt_immediate(i_sll, r,56, r);
6523
	operate_fmt_immediate (i_sra, r, 56, r);
6518
	operate_fmt_immediate(i_sra, r, 56, r);
6524
      }
6519
      }
6525
      else if (name (sh (e)) == swordhd) {
6520
      else if (name(sh(e)) == swordhd) {
6526
	if(!optop(e) && !error_treatment_is_trap(e)){
6521
	if (!optop(e) && !error_treatment_is_trap(e)) {
6527
	  test_signed(r,-0x8000L,0x7fff,trap_label(e));
6522
	  test_signed(r,-0x8000L,0x7fff,trap_label(e));
6528
	}
6523
	}
6529
	else if (error_treatment_is_trap(e)){
6524
	else if (error_treatment_is_trap(e)) {
6530
	  test_signed_and_trap(r,-0x8000L,0x7fff,f_overflow);
6525
	  test_signed_and_trap(r,-0x8000L,0x7fff,f_overflow);
6531
	}
6526
	}
6532
	operate_fmt_immediate (i_sll, r, 48,r);
6527
	operate_fmt_immediate(i_sll, r, 48,r);
6533
	operate_fmt_immediate (i_sra, r, 48,r);
6528
	operate_fmt_immediate(i_sra, r, 48,r);
6534
      }
6529
      }
6535
      else if (name(sh(e)) == slonghd) {
6530
      else if (name(sh(e)) == slonghd) {
6536
	if(!optop(e) && !error_treatment_is_trap(e)){
6531
	if (!optop(e) && !error_treatment_is_trap(e)) {
6537
	  test_signed(r,-0x80000000L,0x7fffffff,trap_label(e));
6532
	  test_signed(r,-0x80000000L,0x7fffffff,trap_label(e));
6538
	}
6533
	}
6539
	else if (error_treatment_is_trap(e)){
6534
	else if (error_treatment_is_trap(e)) {
6540
	  test_signed_and_trap(r,-0x80000000L,0x7fffffff,f_overflow);
6535
	  test_signed_and_trap(r,-0x80000000L,0x7fffffff,f_overflow);
6541
	}
6536
	}
6542
	operate_fmt_immediate(i_sll,r,32,r);
6537
	operate_fmt_immediate(i_sll,r,32,r);
6543
	operate_fmt_immediate(i_sra,r,32,r);
6538
	operate_fmt_immediate(i_sra,r,32,r);
6544
      }
6539
      }
6545
      else if (name(sh(e)) == ulonghd) {
6540
      else if (name(sh(e)) == ulonghd) {
6546
	if(!optop(e) && !error_treatment_is_trap(e)){
6541
	if (!optop(e) && !error_treatment_is_trap(e)) {
6547
	  test_unsigned(r,0xffffffff,trap_label(e));
6542
	  test_unsigned(r,0xffffffff,trap_label(e));
6548
	}
6543
	}
6549
	else if (error_treatment_is_trap(e)){
6544
	else if (error_treatment_is_trap(e)) {
6550
	  test_unsigned(r,0xffffffff,f_overflow);
6545
	  test_unsigned(r,0xffffffff,f_overflow);
6551
	}
6546
	}
6552
	operate_fmt_immediate(i_zap,r,240,r);
6547
	operate_fmt_immediate(i_zap,r,240,r);
6553
      }
6548
      }
6554
      setregalt (aa, r);
6549
      setregalt(aa, r);
6555
      mka.regmove = move (aa, dest, sp, 1);
6550
      mka.regmove = move(aa, dest, sp, 1);
6556
      return mka;
6551
      return mka;
6557
      /* end of round */
6552
      /* end of round */
6558
    }
6553
    }
6559
 
6554
 
6560
    case int_to_bitf_tag :{
6555
    case int_to_bitf_tag:{
6561
      int   r;
6556
      int   r;
6562
      where w;
6557
      where w;
6563
      ash a;
6558
      ash a;
6564
       ash ai;
6559
       ash ai;
6565
       ans aa;
6560
       ans aa;
6566
       space nsp;
6561
       space nsp;
6567
       a = ashof (sh (e));
6562
       a = ashof(sh(e));
6568
       ai = ashof (sh (son (e)));
6563
       ai = ashof(sh(son(e)));
6569
       r = regfrmdest(&dest, sp);
6564
       r = regfrmdest(&dest, sp);
6570
 
6565
 
6571
       setregalt (w.answhere, r);
6566
       setregalt(w.answhere, r);
6572
       w.ashwhere = a;
6567
       w.ashwhere = a;
6573
       code_here (son (e), sp, w);
6568
       code_here(son(e), sp, w);
6574
       if (a.ashsize != ai.ashsize) {
6569
       if (a.ashsize != ai.ashsize) {
6575
	 operate_fmt_immediate (i_and, r,(1 << a.ashsize) - 1,r);
6570
	 operate_fmt_immediate(i_and, r,(1 << a.ashsize) - 1,r);
6576
       }
6571
       }
6577
       nsp = guardreg (r, sp);
6572
       nsp = guardreg(r, sp);
6578
       setregalt (aa, r);
6573
       setregalt(aa, r);
6579
       move (aa, dest, nsp, 0);
6574
       move(aa, dest, nsp, 0);
6580
       return mka;
6575
       return mka;
6581
     }
6576
     }
6582
 
6577
 
6583
 
6578
 
6584
     case bitf_to_int_tag : {
6579
     case bitf_to_int_tag: {
6585
       ash a;
6580
       ash a;
6586
       int   r;
6581
       int   r;
6587
       where w;
6582
       where w;
6588
       a = ashof (sh (son (e)));
6583
       a = ashof(sh(son(e)));
6589
       r = regfrmdest(&dest, sp);
6584
       r = regfrmdest(&dest, sp);
6590
 
6585
 
6591
       setregalt (w.answhere, r);
6586
       setregalt(w.answhere, r);
6592
       w.ashwhere = a;
6587
       w.ashwhere = a;
6593
       code_here (son (e), sp, w);
6588
       code_here(son(e), sp, w);
6594
       if (a.ashsize != 64) {		
6589
       if (a.ashsize != 64) {
6595
	 if ((name ((sh (e))) & 1) == 1) {
6590
	 if ((name((sh(e))) & 1) == 1) {
6596
	   operate_fmt_immediate (i_sll, r,64 - a.ashsize,r);
6591
	   operate_fmt_immediate(i_sll, r,64 - a.ashsize,r);
6597
	   operate_fmt_immediate (i_sra, r,64 - a.ashsize,r);
6592
	   operate_fmt_immediate(i_sra, r,64 - a.ashsize,r);
6598
	 }
6593
	 }
6599
	 else {
6594
	 else {
6600
	   operate_fmt_immediate (i_and,r, ((1 << a.ashsize) - 1),r);
6595
	   operate_fmt_immediate(i_and,r,((1 << a.ashsize) - 1),r);
6601
	 }
6596
	 }
6602
       }
6597
       }
6603
 
6598
 
6604
       move (w.answhere, dest, guardreg (r, sp), 0);
6599
       move(w.answhere, dest, guardreg(r, sp), 0);
6605
       keepreg (e, r);
6600
       keepreg(e, r);
6606
       return mka;
6601
       return mka;
6607
     }
6602
     }
6608
#ifdef trap_tag
6603
#ifdef trap_tag
6609
    case trap_tag : {
6604
    case trap_tag: {
6610
      if(no(e) == f_overflow) {
6605
      if (no(e) == f_overflow) {
6611
	do_exception(f_overflow);
6606
	do_exception(f_overflow);
6612
      }
6607
      }
6613
      else if(no(e) == f_nil_access) {
6608
      else if (no(e) == f_nil_access) {
6614
	do_exception(f_nil_access);
6609
	do_exception(f_nil_access);
6615
      }
6610
      }
6616
      else {
6611
      else {
6617
	do_exception(f_stack_overflow);
6612
	do_exception(f_stack_overflow);
6618
      }
6613
      }
6619
      return mka;
6614
      return mka;
6620
    }
6615
    }
6621
#endif    
6616
#endif
6622
 
6617
 
6623
    case special_tag :{
6618
    case special_tag:{
6624
      if(no(e) == 0){
6619
      if (no(e) == 0) {
6625
	no_parameter_instructions(i_trapb); 
6620
	no_parameter_instructions(i_trapb);
6626
      }
6621
      }
6627
      return mka;
6622
      return mka;
6628
    }
6623
    }
6629
    
6624
 
6630
#if 1
6625
#if 1
6631
     case condassign_tag :{
6626
     case condassign_tag:{
6632
       /*
6627
       /*
6633
	 This handles a conditional assignment of the form:
6628
	 This handles a conditional assignment of the form:
6634
	 IF ( A .rel. B) THEN X = Y, using conditional moves.
6629
	 IF ( A .rel. B) THEN X = Y, using conditional moves.
6635
	 son(e) is the test_tag and bro(son(e)) is the assignment.
6630
	 son(e) is the test_tag and bro(son(e)) is the assignment.
6636
	 Note that the test condition is the opposite of the 
6631
	 Note that the test condition is the opposite of the
6637
	 condition for the conditional move (because the original
6632
	 condition for the conditional move (because the original
6638
	 test is a jump over the assigment).
6633
	 test is a jump over the assigment).
6639
	*/
6634
	*/
6640
       where assdest;
6635
       where assdest;
6641
       instruction cinst;
6636
       instruction cinst;
Line 6649... Line 6644...
6649
       int rev = 0;		/* set if test is reversed */
6644
       int rev = 0;		/* set if test is reversed */
6650
       ans aa;
6645
       ans aa;
6651
       exp rhs = bro(son(cass));
6646
       exp rhs = bro(son(cass));
6652
       failer("ERROR: condassign_tag should not be encountered");
6647
       failer("ERROR: condassign_tag should not be encountered");
6653
       assdest = locate(son(cass),sp,sh(rhs),NO_REG);
6648
       assdest = locate(son(cass),sp,sh(rhs),NO_REG);
6654
       if(((is_floating(name(sh(ltest)))) && 
6649
       if (((is_floating(name(sh(ltest)))) &&
6655
	   (!is_floating(name(sh(son(cass))))))
6650
	  (!is_floating(name(sh(son(cass))))))
6656
	  || ((!is_floating(name(sh(ltest)))) 
6651
	  || ((!is_floating(name(sh(ltest))))
6657
	      && (is_floating((name(sh(son(cass)))))))){
6652
	      && (is_floating((name(sh(son(cass)))))))) {
6658
	 return make_code(ctest,sp,dest,exitlab);
6653
	 return make_code(ctest,sp,dest,exitlab);
6659
       }
6654
       }
6660
       if(is_floating(name(sh(ltest)))){
6655
       if (is_floating(name(sh(ltest)))) {
6661
	 bool fcompare = (name(sh(ltest)) != shrealhd);
6656
	 bool fcompare = (name(sh(ltest))!= shrealhd);
6662
	 instruction compare_ins;
6657
	 instruction compare_ins;
6663
	 space nsp;
6658
	 space nsp;
6664
	 int rdest  = getfreg(sp.flt);
6659
	 int rdest  = getfreg(sp.flt);
6665
	 freg frg;
6660
	 freg frg;
6666
	 targ1 = freg_operand(ltest,sp);
6661
	 targ1 = freg_operand(ltest,sp);
6667
	 nsp = guardreg(targ1,sp);
6662
	 nsp = guardreg(targ1,sp);
6668
	 targ2 = freg_operand(rtest,nsp);
6663
	 targ2 = freg_operand(rtest,nsp);
6669
	 if(fcompare){
6664
	 if (fcompare) {
6670
	   rev = fdouble_comparisons(&compare_ins,testid);
6665
	   rev = fdouble_comparisons(&compare_ins,testid);
6671
	   float_op(compare_ins,targ1,targ2,rdest);
6666
	   float_op(compare_ins,targ1,targ2,rdest);
6672
	 }
6667
	 }
6673
	 else {
6668
	 else {
6674
	   float_op(i_subs,targ1,targ2,rdest);
6669
	   float_op(i_subs,targ1,targ2,rdest);
Line 6680... Line 6675...
6680
	 frg.type = (name(sh(ltest)) == shrealhd)?IEEE_single:IEEE_double;
6675
	 frg.type = (name(sh(ltest)) == shrealhd)?IEEE_single:IEEE_double;
6681
	 float_op(rev?i_fcmovne:i_fcmoveq,rdest,aarg2,aarg1);
6676
	 float_op(rev?i_fcmovne:i_fcmoveq,rdest,aarg2,aarg1);
6682
	 setfregalt(aa,frg);
6677
	 setfregalt(aa,frg);
6683
       }
6678
       }
6684
       else { /* integer */
6679
       else { /* integer */
6685
	 bool is_compare = ((!is_signed(sh(ltest))) && ((testid-5)<0) && 
6680
	 bool is_compare = ((!is_signed(sh(ltest))) && ((testid-5) <0) &&
6686
			    (name(sh(ltest))!=ptrhd))||((is64(sh(ltest))));      
6681
			   (name(sh(ltest))!=ptrhd)) || ((is64(sh(ltest))));
6687
	 instruction compare_ins;
6682
	 instruction compare_ins;
6688
	 int rres;	/* the result of the test */
6683
	 int rres;	/* the result of the test */
6689
	 if(is_compare){
6684
	 if (is_compare) {
6690
	   rev = comparisons(&compare_ins,sh(ltest),testid);
6685
	   rev = comparisons(&compare_ins,sh(ltest),testid);
6691
	 }
6686
	 }
6692
	 
6687
 
6693
	 targ1 = reg_operand(ltest,sp);
6688
	 targ1 = reg_operand(ltest,sp);
6694
	 if(name(rtest) == val_tag){
6689
	 if (name(rtest) == val_tag) {
6695
	   space nsp;
6690
	   space nsp;
6696
	   if(no(rtest) || (isbigval(rtest))){
6691
	   if (no(rtest) || (isbigval(rtest))) {
6697
	     nsp = guardreg(targ1,sp);
6692
	     nsp = guardreg(targ1,sp);
6698
	     rres = getreg(nsp.fixed);
6693
	     rres = getreg(nsp.fixed);
6699
	     if(is_compare){
6694
	     if (is_compare) {
6700
	       if(isbigval(rtest)){
6695
	       if (isbigval(rtest)) {
6701
		 operate_fmt_big_immediate(compare_ins,targ1,
6696
		 operate_fmt_big_immediate(compare_ins,targ1,
6702
					   exp_to_INT64(rtest),rres);
6697
					   exp_to_INT64(rtest),rres);
6703
	       }
6698
	       }
6704
	       else{
6699
	       else{
6705
		 operate_fmt_immediate(compare_ins,targ1,no(rtest),rres);
6700
		 operate_fmt_immediate(compare_ins,targ1,no(rtest),rres);
6706
	       }
6701
	       }
6707
	     }
6702
	     }
6708
	     else{
6703
	     else{
6709
	       if(name(sh(ltest)) == ulonghd){
6704
	       if (name(sh(ltest)) == ulonghd) {
6710
		 operate_fmt_immediate(i_addl,targ1,0,targ1);
6705
		 operate_fmt_immediate(i_addl,targ1,0,targ1);
6711
	       }
6706
	       }
6712
	       if(isbigval(rtest)){
6707
	       if (isbigval(rtest)) {
6713
		 operate_fmt_big_immediate(i_subq,targ1,exp_to_INT64(rtest),
6708
		 operate_fmt_big_immediate(i_subq,targ1,exp_to_INT64(rtest),
6714
					   rres);
6709
					   rres);
6715
	       }
6710
	       }
6716
	       else{
6711
	       else{
6717
		 operate_fmt_immediate(i_subq,targ1,no(rtest),rres);
6712
		 operate_fmt_immediate(i_subq,targ1,no(rtest),rres);
6718
	       }
6713
	       }
6719
	     }
6714
	     }
6720
	   }
6715
	   }
6721
	   else{	/* test against zero */
6716
	   else{	/* test against zero */
6722
	     rev = 0;
6717
	     rev = 0;
6723
	     rres = targ1;
6718
	     rres = targ1;
6724
	   }
6719
	   }
6725
	 }
6720
	 }
6726
	 else{
6721
	 else{
6727
	   space nsp;
6722
	   space nsp;
6728
	   nsp = guardreg(targ1,sp);
6723
	   nsp = guardreg(targ1,sp);
6729
	   targ2 = reg_operand(rtest,nsp);
6724
	   targ2 = reg_operand(rtest,nsp);
6730
	   if (targ2 == 31){
6725
	   if (targ2 == 31) {
6731
	     rev = 0;
6726
	     rev = 0;
6732
	     rres = targ1;
6727
	     rres = targ1;
6733
	   }
6728
	   }
6734
	   else{
6729
	   else{
6735
	     rres = getreg(nsp.fixed);
6730
	     rres = getreg(nsp.fixed);
6736
	     if(is_compare){
6731
	     if (is_compare) {
6737
	       operate_fmt(compare_ins,targ1,targ2,rres);
6732
	       operate_fmt(compare_ins,targ1,targ2,rres);
6738
	     }
6733
	     }
6739
	     else{
6734
	     else{
6740
	       operate_fmt(i_subq,targ1,targ2,rres);
6735
	       operate_fmt(i_subq,targ1,targ2,rres);
6741
	     }
6736
	     }
6742
	   }
6737
	   }
6743
	 }
6738
	 }
6744
	 aarg1 = regfrmdest(&assdest,sp);
6739
	 aarg1 = regfrmdest(&assdest,sp);
6745
	 cinst = condmove((!rev)?testrev[testid-1]:testid);
6740
	 cinst = condmove((!rev)?testrev[testid-1]:testid);
6746
 
6741
 
6747
	 if(is_compare){
6742
	 if (is_compare) {
6748
	   cinst = rev?i_cmovne:i_cmoveq;
6743
	   cinst = rev?i_cmovne:i_cmoveq;
6749
	 }
6744
	 }
6750
	 else{
6745
	 else{
6751
	   cinst = condmove((!rev)?testrev[testid-1]:testid);
6746
	   cinst = condmove((!rev)?testrev[testid-1]:testid);
6752
	 }
6747
	 }
6753
	 
6748
 
6754
	 if(name(rhs) == val_tag){
6749
	 if (name(rhs) == val_tag) {
6755
	   if(isbigval(rhs)){
6750
	   if (isbigval(rhs)) {
6756
	     operate_fmt_big_immediate(cinst,rres,exp_to_INT64(rhs),aarg1);
6751
	     operate_fmt_big_immediate(cinst,rres,exp_to_INT64(rhs),aarg1);
6757
	   }
6752
	   }
6758
	   else{
6753
	   else{
6759
	     if(no(rhs) == 0 && (testid == 5)){
6754
	     if (no(rhs) == 0 && (testid == 5)) {
6760
	       operate_fmt_immediate(i_cmpeq,rres,31,aarg1);
6755
	       operate_fmt_immediate(i_cmpeq,rres,31,aarg1);
6761
	     }
6756
	     }
6762
	     else{
6757
	     else{
6763
	       operate_fmt_big_immediate(cinst,rres,exp_to_INT64(rhs),aarg1);
6758
	       operate_fmt_big_immediate(cinst,rres,exp_to_INT64(rhs),aarg1);
6764
	     }
6759
	     }
6765
	     	   }	
6760
	     	   }
6766
	 }
6761
	 }
6767
	 else{
6762
	 else{
6768
	   int r2 = reg_operand(rhs,sp);
6763
	   int r2 = reg_operand(rhs,sp);
6769
	   operate_fmt(cinst,rres,r2,aarg1);
6764
	   operate_fmt(cinst,rres,r2,aarg1);
6770
	 }
6765
	 }
6771
	 setregalt(aa,aarg1);
6766
	 setregalt(aa,aarg1);
6772
       }
6767
       }
6773
       (void)move(aa,assdest,sp,1);
6768
      (void)move(aa,assdest,sp,1);
6774
       (void)move(aa,dest,sp,1);
6769
      (void)move(aa,dest,sp,1);
6775
       clear_dep_reg(son(cass));
6770
       clear_dep_reg(son(cass));
6776
       return mka;
6771
       return mka;
6777
     }
6772
     }
6778
#endif
6773
#endif
6779
    default: 
6774
    default:
6780
      alphafail(TAG_NOT_IMPLEMENTED);
6775
      alphafail(TAG_NOT_IMPLEMENTED);
6781
    }				/* end outer switch */
6776
    }				/* end outer switch */
6782
 
6777
 
6783
moveconst:{
6778
moveconst:{
6784
  int   r = regfrmdest(&dest, sp);
6779
  int   r = regfrmdest(&dest, sp);
6785
  ans aa;
6780
  ans aa;
6786
  if(r==NO_REG)
6781
  if (r==NO_REG)
6787
    r=getreg(sp.fixed);
6782
    r=getreg(sp.fixed);
6788
  if (r != 31) {		/* somewhere! */
6783
  if (r != 31) {		/* somewhere! */
6789
    if(INT64_eq(constval,zero_int64))
6784
    if (INT64_eq(constval,zero_int64))
6790
      operate_fmt(i_bis,31,31,r);
6785
      operate_fmt(i_bis,31,31,r);
6791
    else{
6786
    else{
6792
      load_store_immediate(is64(sh(e))?i_ldiq:i_ldil,r,constval);
6787
      load_store_immediate(is64(sh(e))?i_ldiq:i_ldil,r,constval);
6793
    }
6788
    }
6794
    setregalt (aa, r);
6789
    setregalt(aa, r);
6795
    move (aa, dest, guardreg (r, sp), 1);
6790
    move(aa, dest, guardreg(r, sp), 1);
6796
  }
6791
  }
6797
  mka.regmove = r;
6792
  mka.regmove = r;
6798
  return mka;
6793
  return mka;
6799
 }
6794
 }
6800
  
6795
 
6801
}					/* end make_code */
6796
}					/* end make_code */
6802
 
6797
 
6803
 
6798
 
6804
 
6799