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
Line 18... Line 48...
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
*/
Line 33... Line 63...
33
$Date: 1998/01/17 15:56:06 $
63
$Date: 1998/01/17 15:56:06 $
34
$Revision: 1.1.1.1 $
64
$Revision: 1.1.1.1 $
35
$Log: new_code.c,v $
65
$Log: new_code.c,v $
36
 * Revision 1.1.1.1  1998/01/17  15:56:06  release
66
 * Revision 1.1.1.1  1998/01/17  15:56:06  release
37
 * First version to be checked into rolling release.
67
 * First version to be checked into rolling release.
38
 *
68
 *
39
 * Revision 1.39  1996/11/12  10:37:36  currie
69
 * Revision 1.39  1996/11/12  10:37:36  currie
40
 * cases with big unsigned
70
 * cases with big unsigned
41
 *
71
 *
42
Revision 1.38  1996/03/28 11:36:27  currie
72
Revision 1.38  1996/03/28 11:36:27  currie
43
minus unsigned with et
73
minus unsigned with et
Line 54... Line 84...
54
 * Revision 1.34  1996/01/10  17:59:28  currie
84
 * Revision 1.34  1996/01/10  17:59:28  currie
55
 * postlude uses in callees
85
 * postlude uses in callees
56
 *
86
 *
57
 * Revision 1.33  1996/01/09  12:00:48  currie
87
 * Revision 1.33  1996/01/09  12:00:48  currie
58
 * var callee par in reg
88
 * var callee par in reg
59
 *
89
 *
60
 * Revision 1.32  1996/01/08  17:05:27  currie
90
 * Revision 1.32  1996/01/08  17:05:27  currie
61
 * current_env in depends_on
91
 * current_env in depends_on
62
 *
92
 *
63
 * Revision 1.31  1996/01/02  15:00:57  currie
93
 * Revision 1.31  1996/01/02  15:00:57  currie
64
 * return 64-bit const
94
 * return 64-bit const
Line 69... Line 99...
69
 * Revision 1.29  1995/11/23  13:17:25  currie
99
 * Revision 1.29  1995/11/23  13:17:25  currie
70
 * Cache real consts + get text file name right in diags
100
 * Cache real consts + get text file name right in diags
71
 *
101
 *
72
 * Revision 1.28  1995/10/31  17:46:10  currie
102
 * Revision 1.28  1995/10/31  17:46:10  currie
73
 * max-min register error
103
 * max-min register error
74
 *
104
 *
75
 * Revision 1.27  1995/10/31  15:04:55  currie
105
 * Revision 1.27  1995/10/31  15:04:55  currie
76
 * div1 error
106
 * div1 error
77
 *
107
 *
78
 * Revision 1.26  1995/10/25  13:48:23  currie
108
 * Revision 1.26  1995/10/25  13:48:23  currie
79
 * change to position of .glob
109
 * change to position of .glob
Line 90... Line 120...
90
 * Revision 1.22  1995/09/26  09:00:54  currie
120
 * Revision 1.22  1995/09/26  09:00:54  currie
91
 * tail call errors in sieve
121
 * tail call errors in sieve
92
 *
122
 *
93
 * Revision 1.21  1995/09/21  15:42:51  currie
123
 * Revision 1.21  1995/09/21  15:42:51  currie
94
 * silly reordering by as again
124
 * silly reordering by as again
95
 *
125
 *
96
 * Revision 1.20  1995/09/20  14:23:02  currie
126
 * Revision 1.20  1995/09/20  14:23:02  currie
97
 * callee-list blunder + fix for silliness in ultrix assembler
127
 * callee-list blunder + fix for silliness in ultrix assembler
98
 *
128
 *
99
 * Revision 1.19  1995/09/12  10:59:39  currie
129
 * Revision 1.19  1995/09/12  10:59:39  currie
100
 * gcc pedanttry
130
 * gcc pedanttry
Line 111... Line 141...
111
 * Revision 1.15  1995/08/15  10:47:29  currie
141
 * Revision 1.15  1995/08/15  10:47:29  currie
112
 * Dynamic callees - protect parregs & link
142
 * Dynamic callees - protect parregs & link
113
 *
143
 *
114
 * Revision 1.14  1995/08/15  09:19:29  currie
144
 * Revision 1.14  1995/08/15  09:19:29  currie
115
 * Dynamic callees + trap_tag
145
 * Dynamic callees + trap_tag
116
 *
146
 *
117
 * Revision 1.13  1995/08/10  08:49:40  currie
147
 * Revision 1.13  1995/08/10  08:49:40  currie
118
 * var callee tail call
148
 * var callee tail call
119
 *
149
 *
120
 * Revision 1.12  1995/08/09  10:53:42  currie
150
 * Revision 1.12  1995/08/09  10:53:42  currie
121
 * apply_general bug
151
 * apply_general bug
Line 220... Line 250...
220
 
250
 
221
long aritherr_lab = 0;
251
long aritherr_lab = 0;
222
long stackerr_lab = 0;
252
long stackerr_lab = 0;
223
long allocaerr_lab = 0;
253
long allocaerr_lab = 0;
224
 
254
 
225
extern exp find_named_tg PROTO_S ((char *, shape));
255
extern exp find_named_tg(char *, shape);
226
extern shape f_pointer PROTO_S ((alignment));
256
extern shape f_pointer(alignment);
227
extern alignment f_alignment PROTO_S ((shape));
257
extern alignment f_alignment(shape);
228
extern shape f_proc;
258
extern shape f_proc;
229
 
259
 
230
typedef struct{int dble; r2l r; instore ad;} rcache;
260
typedef struct{int dble; r2l r; instore ad;} rcache;
231
static rcache rca[16];
261
static rcache rca[16];
232
static int nca = 0;
262
static int nca = 0;
233
 
263
 
234
void do_exception
264
void do_exception
235
    PROTO_N ( (e) )
-
 
236
    PROTO_T ( int e )
265
(int e)
237
{
266
{
238
	baseoff b;
267
	baseoff b;
239
	b.base = 0; b.offset = e;
268
	b.base = 0; b.offset = e;
240
	ls_ins(i_li, 4,  b);
269
	ls_ins(i_li, 4,  b);
241
	b = boff(find_named_tg("__TDFhandler", f_pointer(f_alignment(f_proc))));
270
	b = boff(find_named_tg("__TDFhandler", f_pointer(f_alignment(f_proc))));
242
	ls_ins(i_lw, 25, b);
271
	ls_ins(i_lw, 25, b);
243
	br_ins(i_j, 25);
272
	br_ins(i_j, 25);
244
}
273
}
245
 
274
 
246
long trap_label
275
long trap_label
247
    PROTO_N ( (e) )
-
 
248
    PROTO_T ( exp e )
276
(exp e)
249
{
277
{
250
	if ((errhandle(e)&3)==3) {
278
	if ((errhandle(e) &3) ==3) {
251
          	if (aritherr_lab==0) aritherr_lab = new_label();
279
          	if (aritherr_lab==0)aritherr_lab = new_label();
252
          	return aritherr_lab;
280
          	return aritherr_lab;
253
        }
281
        }
254
        else return no (son (pt (e)));
282
        else return no(son(pt(e)));
255
}
283
}
256
 
284
 
257
void dump_gp
285
void dump_gp
258
    PROTO_Z ()
286
(void)
259
{
287
{
260
	baseoff b;
288
	baseoff b;
261
	b.base = 29; b.offset = locals_offset>>3;
289
	b.base = 29; b.offset = locals_offset>>3;
262
	ls_ins(i_sw, 28, b);
290
	ls_ins(i_sw, 28, b);
263
}
291
}
264
 
292
 
265
void reset_gp
293
void reset_gp
266
    PROTO_Z ()
294
(void)
267
{
295
{
268
	baseoff b;
296
	baseoff b;
269
	if (Has_vcallees) {
297
	if (Has_vcallees) {
270
		b.base = local_reg;
298
		b.base = local_reg;
271
		b.offset = (locals_offset - frame_size)>>3;
299
		b.offset = (locals_offset - frame_size) >>3;
272
	}
300
	}
273
	else
301
	else
274
	if (Has_fp) {
302
	if (Has_fp) {
275
		b.base = 30;
303
		b.base = 30;
276
		b.offset = (locals_offset - frame_size - callee_size)>>3;
304
		b.offset = (locals_offset - frame_size - callee_size) >>3;
277
	}
305
	}
278
	else {
306
	else {
279
		b.base = 29;
307
		b.base = 29;
280
		b.offset = locals_offset>>3;
308
		b.offset = locals_offset>>3;
281
        }
309
        }
282
	ls_ins(i_lw, 28, b);
310
	ls_ins(i_lw, 28, b);
283
}
311
}
284
 
312
 
285
bool unsafe
313
bool unsafe
286
    PROTO_N ( (e) )
-
 
287
    PROTO_T ( exp e )
314
(exp e)
288
{		/*  usages of parameters which might be
315
{		/*  usages of parameters which might be
289
				   vararg */
316
				   vararg */
290
/*
317
/*
291
  if (last (e))
318
  if (last (e))
292
    return (name (bro (e)) != cont_tag && name (bro (e)) != par_tag);
319
    return (name (bro (e)) != cont_tag && name (bro (e)) != par_tag);
Line 310... Line 337...
310
}
337
}
311
 
338
 
312
 
339
 
313
 
340
 
314
void checknan
341
void checknan
315
    PROTO_N ( (e, sp) )
-
 
316
    PROTO_T ( exp e X space sp )
342
(exp e, space sp)
317
{
343
{
318
           long trap = trap_label(e);
344
           long trap = trap_label(e);
319
           int r1 = getreg(sp.fixed);
345
           int r1 = getreg(sp.fixed);
320
           int r2 = getreg(guardreg(r1, sp).fixed);
346
           int r2 = getreg(guardreg(r1, sp).fixed);
321
           cop_ins(i_cfc1, r1, 31);
347
           cop_ins(i_cfc1, r1, 31);
Line 344... Line 370...
344
  }
370
  }
345
}
371
}
346
*/
372
*/
347
 
373
 
348
void testsigned
374
void testsigned
349
    PROTO_N ( (r, lower, upper, lab) )
-
 
350
    PROTO_T ( int r X long lower X long upper X long lab )
375
(int r, long lower, long upper, long lab)
351
{
376
{
352
	condri_ins(i_blt, r, lower, lab);
377
	condri_ins(i_blt, r, lower, lab);
353
	condri_ins(i_bgt, r, upper, lab);
378
	condri_ins(i_bgt, r, upper, lab);
354
}
379
}
355
 
380
 
356
void testusigned
381
void testusigned
357
    PROTO_N ( (r, maxval, lab) )
-
 
358
    PROTO_T ( int r X long maxval X long lab )
382
(int r, long maxval, long lab)
359
{
383
{
360
     	condri_ins(i_bgtu, r, maxval, lab);
384
     	condri_ins(i_bgtu, r, maxval, lab);
361
}
385
}
362
 
386
 
363
/*
387
/*
364
char *sbranches(i)
388
char *sbranches(i)
365
	int i;
389
	int i;
366
{
390
{
367
  switch (i) {
391
  switch (i) {
368
    case  1:
392
    case  1:
369
            return i_ble;
393
            return i_ble;
370
    case 2:
394
    case 2:
371
      return i_blt;
395
      return i_blt;
372
    case 3:
396
    case 3:
Line 380... Line 404...
380
  }
404
  }
381
}
405
}
382
*/
406
*/
383
 
407
 
384
char * branches
408
char * branches
385
    PROTO_N ( (s, i) )
-
 
386
    PROTO_T ( shape s X int i )
409
(shape s, int i)
387
{
410
{
388
	int n = name(s);
411
	int n = name(s);
389
	if (n == scharhd || n == swordhd || n == slonghd
412
	if (n == scharhd || n == swordhd || n == slonghd
390
		|| n == offsethd) {
413
		|| n == offsethd) {
391
          switch (i) {
414
          switch (i) {
Line 463... Line 486...
463
  }
486
  }
464
}
487
}
465
*/
488
*/
466
 
489
 
467
char * sets
490
char * sets
468
    PROTO_N ( (s, i) )
-
 
469
    PROTO_T ( shape s X int i )
491
(shape s, int i)
470
{
492
{
471
	int n = name(s);
493
	int n = name(s);
472
	if (n == scharhd || n == swordhd || n == slonghd
494
	if (n == scharhd || n == swordhd || n == slonghd
473
		|| n == offsethd) {
495
		|| n == offsethd) {
474
		  switch (i) {
496
		  switch (i) {
Line 478... Line 500...
478
		      return i_sge;
500
		      return i_sge;
479
		    case 3:
501
		    case 3:
480
		      return i_slt;
502
		      return i_slt;
481
		    case 4:
503
		    case 4:
482
		      return i_sle;
504
		      return i_sle;
483
		    case 5:
505
		    case 5:
484
		      return i_seq;
506
		      return i_seq;
485
		    case 6:
507
		    case 6:
486
		      return i_sne;
508
		      return i_sne;
487
		  }
509
		  }
488
	}
510
	}
489
	else {
511
	else {
490
		  switch (i) {
512
		  switch (i) {
491
		    case  1:
513
		    case  1:
492
		            return i_sgtu;
514
		            return i_sgtu;
493
		    case 2:
515
		    case 2:
Line 504... Line 526...
504
	}
526
	}
505
	return i_seq;
527
	return i_seq;
506
}
528
}
507
 
529
 
508
char *fbranches
530
char *fbranches
509
    PROTO_N ( (i) )
-
 
510
    PROTO_T ( int i )
531
(int i)
511
{
532
{
512
  switch (i) {
533
  switch (i) {
513
    case  1:
534
    case  1:
514
            return i_c_le_s;
535
            return i_c_le_s;
515
    case 2:
536
    case 2:
Line 525... Line 546...
525
  }
546
  }
526
  return i_c_eq_s;
547
  return i_c_eq_s;
527
}
548
}
528
 
549
 
529
char *fdbranches
550
char *fdbranches
530
    PROTO_N ( (i) )
-
 
531
    PROTO_T ( int i )
551
(int i)
532
{
552
{
533
  switch (i) {
553
  switch (i) {
534
    case  1:
554
    case  1:
535
            return i_c_le_d;
555
            return i_c_le_d;
536
    case 2:
556
    case 2:
Line 551... Line 571...
551
  4, 3, 2, 1, 6, 5
571
  4, 3, 2, 1, 6, 5
552
};
572
};
553
 /* used to invert TDF tests */
573
 /* used to invert TDF tests */
554
 
574
 
555
int   bitsin
575
int   bitsin
556
    PROTO_N ( (b) )
-
 
557
    PROTO_T ( long b )
576
(long b)
558
{		/* counts the bits in b */
577
{		/* counts the bits in b */
559
  int   n = 0;
578
  int   n = 0;
560
  long  mask = 1;
579
  long  mask = 1;
561
  for (; b != 0;) {
580
  for (; b != 0;) {
562
    n += ((b & mask) != 0) ? 1 : 0;
581
    n += ((b & mask)!= 0)? 1 : 0;
563
    b &= ~mask;
582
    b &= ~mask;
564
    mask = mask << 1;
583
    mask = mask << 1;
565
  }
584
  }
566
  return n;
585
  return n;
567
}
586
}
568
 
587
 
569
void move_dlts
588
void move_dlts
570
    PROTO_N ( (dr, sr, szr, mr, bytemove) )
-
 
571
    PROTO_T ( int dr X int sr X int szr X int mr X int bytemove )
589
(int dr, int sr, int szr, int mr, int bytemove)
572
{
590
{
573
	/* move szr bytes to dr from sr (use mr)- either nooverlap or dr<=sr */
591
	/* move szr bytes to dr from sr (use mr)- either nooverlap or dr<=sr */
574
	baseoff b;
592
	baseoff b;
575
	int lin = new_label();
593
	int lin = new_label();
576
 
594
 
577
	b.offset =0;
595
	b.offset =0;
578
 	set_label(lin);
596
 	set_label(lin);
579
 	b.base = sr;
597
 	b.base = sr;
580
 	ls_ins((bytemove)?i_lb:i_lw, mr, b);
598
 	ls_ins((bytemove)?i_lb:i_lw, mr, b);
581
 	rri_ins(i_addu, sr, sr, (bytemove)?1:4);
599
 	rri_ins(i_addu, sr, sr,(bytemove)?1:4);
582
 	b.base = dr;
600
 	b.base = dr;
583
 	ls_ins((bytemove)?i_sb:i_sw, mr, b);
601
 	ls_ins((bytemove)?i_sb:i_sw, mr, b);
584
 	rri_ins(i_addu, dr, dr, (bytemove)?1:4);
602
 	rri_ins(i_addu, dr, dr,(bytemove)?1:4);
585
 	rri_ins(i_subu, szr, szr, (bytemove)?1:4);
603
 	rri_ins(i_subu, szr, szr,(bytemove)?1:4);
586
 	condrr_ins(i_bne, szr, 0, lin);
604
 	condrr_ins(i_bne, szr, 0, lin);
587
}
605
}
588
 
606
 
589
void move_dgts
607
void move_dgts
590
    PROTO_N ( (dr, sr, szr, mr, bytemove) )
-
 
591
    PROTO_T ( int dr X int sr X int szr X int mr X int bytemove )
608
(int dr, int sr, int szr, int mr, int bytemove)
592
{
609
{
593
	/* move szr bytes to dr from sr (use mr) with overlap and dr>sr */
610
	/* move szr bytes to dr from sr (use mr) with overlap and dr>sr */
594
	baseoff b;
611
	baseoff b;
595
	int lin = new_label();
612
	int lin = new_label();
596
 
613
 
Line 599... Line 616...
599
	rrr_ins(i_addu, dr,dr, szr);
616
	rrr_ins(i_addu, dr,dr, szr);
600
	rrr_ins(i_addu, sr,sr, szr);
617
	rrr_ins(i_addu, sr,sr, szr);
601
 	set_label(lin);
618
 	set_label(lin);
602
 	b.base = sr;
619
 	b.base = sr;
603
 	ls_ins((bytemove)?i_lb:i_lw, mr, b);
620
 	ls_ins((bytemove)?i_lb:i_lw, mr, b);
604
 	rri_ins(i_subu, sr, sr, (bytemove)?1:4);
621
 	rri_ins(i_subu, sr, sr,(bytemove)?1:4);
605
 	b.base = dr;
622
 	b.base = dr;
606
 	ls_ins((bytemove)?i_sb:i_sw, mr, b);
623
 	ls_ins((bytemove)?i_sb:i_sw, mr, b);
607
 	rri_ins(i_subu, dr, dr, (bytemove)?1:4);
624
 	rri_ins(i_subu, dr, dr,(bytemove)?1:4);
608
 	rri_ins(i_subu, szr, szr, (bytemove)?1:4);
625
 	rri_ins(i_subu, szr, szr,(bytemove)?1:4);
609
 	condrr_ins(i_bne, szr, 0, lin);
626
 	condrr_ins(i_bne, szr, 0, lin);
610
}
627
}
611
 
628
 
612
void reset_tos
629
void reset_tos
613
    PROTO_Z ()
630
(void)
614
{
631
{
615
    	if (Has_tos) {
632
    	if (Has_tos) {
616
    		baseoff b;
633
    		baseoff b;
617
    		b.base = 30;
634
    		b.base = 30;
618
    		b.offset = -8;
635
    		b.offset = -8;
619
    		ls_ins(i_sw, 29, b);
636
    		ls_ins(i_sw, 29, b);
620
    	}
637
    	}
621
}
638
}
622
 
639
 
623
exp testlast
640
exp testlast
624
    PROTO_N ( (e, second) )
-
 
625
    PROTO_T ( exp e X exp second )
641
(exp e, exp second)
626
{
642
{
627
  /* finds the last test in sequence e which is a branch to second, if
643
  /* finds the last test in sequence e which is a branch to second, if
628
     any, otherwise nil */
644
     any, otherwise nil */
629
  if (name (e) == test_tag && pt (e) == second) {
645
  if (name(e) == test_tag && pt(e) == second) {
630
    return (e);
646
    return(e);
631
  }
647
  }
632
  if (name (e) == seq_tag) {
648
  if (name(e) == seq_tag) {
633
    if (name (bro (son (e))) == test_tag && pt (bro (son (e))) == second) {
649
    if (name(bro(son(e))) == test_tag && pt(bro(son(e))) == second) {
634
      return bro (son (e));
650
      return bro(son(e));
635
    }
651
    }
636
    else
652
    else
637
      if (name (bro (son (e))) == top_tag) {
653
      if (name(bro(son(e))) == top_tag) {
638
	exp list = son (son (e));
654
	exp list = son(son(e));
639
	for (;;) {
655
	for (;;) {
640
	  if (last (list)) {
656
	  if (last(list)) {
641
	    if (name (list) == test_tag && pt (list) == second) {
657
	    if (name(list) == test_tag && pt(list) == second) {
642
	      return list;
658
	      return list;
643
	    }
659
	    }
644
	    else {
660
	    else {
645
	      return 0;
661
	      return 0;
646
	    }
662
	    }
647
	  }
663
	  }
648
	  else {
664
	  else {
649
	    list = bro (list);
665
	    list = bro(list);
650
	  }
666
	  }
651
	}
667
	}
652
      }
668
      }
653
  }
669
  }
654
  return 0;
670
  return 0;
655
}
671
}
656
 
672
 
657
 
673
 
658
 
674
 
659
bool last_param
675
bool last_param
660
    PROTO_N ( (e) )
-
 
661
    PROTO_T ( exp e )
676
(exp e)
662
{
677
{
663
	if (!isparam(e)) return 0;
678
	if (!isparam(e)) return 0;
664
	e = bro(son(e));
679
	e = bro(son(e));
665
    aa:	if (name(e)==ident_tag && isparam(e)
680
    aa:	if (name(e) ==ident_tag && isparam(e)
666
		&& name(son(e)) != formal_callee_tag
681
		&& name(son(e))!= formal_callee_tag
667
		) return 0;
682
		) return 0;
668
	if (name(e) == diagnose_tag) {
683
	if (name(e) == diagnose_tag) {
669
	    e = son(e); goto aa;
684
	    e = son(e); goto aa;
670
	}
685
	}
671
	return 1;
686
	return 1;
672
}
687
}
673
 
688
 
674
int regfrmdest
689
int regfrmdest
675
    PROTO_N ( (dest, sp) )
-
 
676
    PROTO_T ( where * dest X space sp )
690
(where * dest, space sp)
677
{
691
{
678
 	switch (dest->answhere.discrim) {
692
 	switch (dest->answhere.discrim) {
679
	  case inreg:
693
	  case inreg:
680
	    {
694
	    {
681
	      int r = regalt (dest->answhere);
695
	      int r = regalt(dest->answhere);
682
	      if (r!=0) return r;
696
	      if (r!=0) return r;
683
 
697
 
684
	    }
698
	    }
685
	  default:
699
	  default:
686
	    {
700
	    {
687
	      return getreg (sp.fixed);
701
	      return getreg(sp.fixed);
688
	    }
702
	    }
689
	}
703
	}
690
}
704
}
691
 
705
 
692
space do_callers
706
space do_callers
693
    PROTO_N ( (list,sp) )
-
 
694
    PROTO_T ( exp list X space sp )
707
(exp list, space sp)
695
{	int   disp =0;
708
{	int   disp =0;
696
	int   spar = 4;
709
	int   spar = 4;
697
	int   fpar = 6;
710
	int   fpar = 6;
698
	bool hadfixed = 0;
711
	bool hadfixed = 0;
699
 
712
 
700
	  for (;;) {		/* evaluate parameters in turn */
713
	  for (;;) {		/* evaluate parameters in turn */
701
	    int   hd = name (sh (list));
714
	    int   hd = name(sh(list));
702
	    instore is;
715
	    instore is;
703
	    where w;
716
	    where w;
704
	    ash ap;
717
	    ash ap;
705
	    int paral;
718
	    int paral;
706
	    int parsize;
719
	    int parsize;
707
	    exp par;
720
	    exp par;
708
	    par = (name(list)==caller_tag)?son(list):list;
721
	    par = (name(list) ==caller_tag)?son(list):list;
709
	    ap = ashof (sh (list));
722
	    ap = ashof(sh(list));
710
	    paral = (ap.ashalign < 32)?32:ap.ashalign;
723
	    paral = (ap.ashalign < 32)?32:ap.ashalign;
711
	    parsize = ap.ashsize;
724
	    parsize = ap.ashsize;
712
	    w.ashwhere = ap;
725
	    w.ashwhere = ap;
713
	    disp = rounder(disp,paral);
726
	    disp = rounder(disp,paral);
714
	    spar = 4+ (disp>>5);
727
	    spar = 4+ (disp>>5);
Line 719... Line 732...
719
 
732
 
720
	    if (is_floating(hd) && disp+parsize <= 128) {
733
	    if (is_floating(hd) && disp+parsize <= 128) {
721
	      freg frg;
734
	      freg frg;
722
	      ans ansfr;
735
	      ans ansfr;
723
	      frg.fr = fpar++;
736
	      frg.fr = fpar++;
724
	      frg.dble = (hd != shrealhd) ? 1 : 0;
737
	      frg.dble = (hd != shrealhd)? 1 : 0;
725
	      setfregalt (ansfr, frg);
738
	      setfregalt(ansfr, frg);
726
	      w.answhere = ansfr;
739
	      w.answhere = ansfr;
727
	      code_here (par, sp, w);
740
	      code_here(par, sp, w);
728
	      /* eval parameter into floating parameter register */
741
	      /* eval parameter into floating parameter register */
729
	      sp = guardfreg(frg.fr, sp);
742
	      sp = guardfreg(frg.fr, sp);
730
	      if (hadfixed) {
743
	      if (hadfixed) {
731
		  setregalt (w.answhere, spar);
744
		  setregalt(w.answhere, spar);
732
		  move (ansfr, w, sp, 1);
745
		  move(ansfr, w, sp, 1);
733
		  sp = guardreg(spar, sp);
746
		  sp = guardreg(spar, sp);
734
		  if (hd != shrealhd) { sp = guardreg(spar+1, sp); }
747
		  if (hd != shrealhd) { sp = guardreg(spar+1, sp); }
735
	      }
748
	      }
736
	    }
749
	    }
737
	    else
750
	    else
738
	    if (valregable (sh (list)) && disp+parsize <=128) {
751
	    if (valregable(sh(list)) && disp+parsize <=128) {
739
		ans ansr;
752
		ans ansr;
740
		setregalt (ansr, spar);
753
		setregalt(ansr, spar);
741
		w.answhere = ansr;
754
		w.answhere = ansr;
742
		hadfixed = 1;
755
		hadfixed = 1;
743
		code_here (par, sp, w);
756
		code_here(par, sp, w);
744
		/* eval parameter into fixed parameter register */
757
		/* eval parameter into fixed parameter register */
745
		sp = guardreg (spar, sp);
758
		sp = guardreg(spar, sp);
746
	    }
759
	    }
747
	    else {
760
	    else {
748
		setinsalt (w.answhere, is);
761
		setinsalt(w.answhere, is);
749
		code_here (par, sp, w);
762
		code_here(par, sp, w);
750
		hadfixed = 1;
763
		hadfixed = 1;
751
		/* eval parameter into argument space on stack */
764
		/* eval parameter into argument space on stack */
752
		while (spar <= 7 && ap.ashsize >0) {
765
		while (spar <= 7 && ap.ashsize >0) {
753
			/* copy (parts of) any struct results into parregs */
766
			/* copy (parts of) any struct results into parregs */
754
			ls_ins(i_lw, spar, is.b);
767
			ls_ins(i_lw, spar, is.b);
Line 756... Line 769...
756
			is.b.offset +=4;
769
			is.b.offset +=4;
757
			ap.ashsize-=32;
770
			ap.ashsize-=32;
758
		}
771
		}
759
	   }
772
	   }
760
 
773
 
761
	   if(name(list)== caller_tag) { no(list) = disp; }
774
	   if (name(list) == caller_tag) { no(list) = disp; }
762
 
775
 
763
	   disp+=parsize;
776
	   disp+=parsize;
764
	   disp = rounder(disp, 32);
777
	   disp = rounder(disp, 32);
765
 
778
 
766
 
779
 
767
	   if (last (list)) return sp;
780
	   if (last(list)) return sp;
768
	   list = bro (list);
781
	   list = bro(list);
769
	  }			/* end for */
782
	  }			/* end for */
770
 
783
 
771
}
784
}
772
 
785
 
773
 
786
 
774
 
787
 
775
void load_reg
788
void load_reg
776
    PROTO_N ( (e, r, sp) )
-
 
777
    PROTO_T ( exp e X int r X space sp )
789
(exp e, int r, space sp)
778
{
790
{
779
	where w;
791
	where w;
780
	w.ashwhere = ashof(sh(e));
792
	w.ashwhere = ashof(sh(e));
781
	setregalt(w.answhere, r);
793
	setregalt(w.answhere, r);
782
	code_here(e, sp, w);
794
	code_here(e, sp, w);
Line 786... Line 798...
786
 
798
 
787
typedef struct postl_ {exp pl; struct postl_ * outer; } postl_chain;
799
typedef struct postl_ {exp pl; struct postl_ * outer; } postl_chain;
788
static postl_chain * old_pls;
800
static postl_chain * old_pls;
789
 
801
 
790
void update_plc
802
void update_plc
791
    PROTO_N ( (ch, ma) )
-
 
792
    PROTO_T ( postl_chain * ch X int ma )
803
(postl_chain * ch, int ma)
793
{
804
{
794
	while (ch != (postl_chain*)0) {
805
	while (ch != (postl_chain*)0) {
795
	  exp pl= ch->pl;
806
	  exp pl= ch->pl;
796
	  while (name(pl)==ident_tag && name(son(pl))==caller_name_tag) {
807
	  while (name(pl) ==ident_tag && name(son(pl)) ==caller_name_tag) {
797
		no(pl)+= (ma<<1);
808
		no(pl) += (ma<<1);
798
		pl = bro(son(pl));
809
		pl = bro(son(pl));
799
	  }
810
	  }
800
	  ch = ch->outer;
811
	  ch = ch->outer;
801
	}
812
	}
802
}
813
}
803
 
814
 
804
void do_callee_list
815
void do_callee_list
805
    PROTO_N ( (e, sp) )
-
 
806
    PROTO_T ( exp e X space sp )
816
(exp e, space sp)
807
{
817
{
808
    	long x = ((no(e)>>3)+23) & ~7;
818
    	long x = ((no(e) >>3) +23) & ~7;
809
    	exp list = son(e);
819
    	exp list = son(e);
810
    	instore is;
820
    	instore is;
811
    	where w;
821
    	where w;
812
    	baseoff b;
822
    	baseoff b;
813
    	long disp;
823
    	long disp;
Line 818... Line 828...
818
    	ls_ins(i_sw, 30, b);
828
    	ls_ins(i_sw, 30, b);
819
 
829
 
820
	update_plc(old_pls, x<<3);
830
	update_plc(old_pls, x<<3);
821
 
831
 
822
    	if (no(e)!= 0) {
832
    	if (no(e)!= 0) {
823
    		for(;;) {
833
    		for (;;) {
824
    			ap = ashof(sh(list));
834
    			ap = ashof(sh(list));
825
    			disp = rounder(disp, ap.ashalign);
835
    			disp = rounder(disp, ap.ashalign);
826
    			is.b.offset = disp>>3;
836
    			is.b.offset = disp>>3;
827
    			is.b.base = 29; is.adval = 1;
837
    			is.b.base = 29; is.adval = 1;
828
    			w.ashwhere = ap;
838
    			w.ashwhere = ap;
829
    			setinsalt(w.answhere, is);
839
    			setinsalt(w.answhere, is);
830
    			code_here(list, sp, w);
840
    			code_here(list, sp, w);
831
    			disp = rounder(disp+ap.ashsize, 32);
841
    			disp = rounder(disp+ap.ashsize, 32);
832
    			if (last(list)) break;
842
    			if (last(list))break;
833
    			list = bro(list);
843
    			list = bro(list);
834
    		}
844
    		}
835
    	}
845
    	}
836
	update_plc(old_pls, -(x<<3));
846
	update_plc(old_pls, - (x<<3));
837
}
847
}
838
 
848
 
839
exp find_ote
849
exp find_ote
840
    PROTO_N ( (e, n) )
-
 
841
    PROTO_T ( exp e X int n )
850
(exp e, int n)
842
{
851
{
843
	exp d = father(e);
852
	exp d = father(e);
844
	while (name(d)!=apply_general_tag) d = father(d);
853
	while (name(d)!=apply_general_tag)d = father(d);
845
	d = son(bro(son(d))); /* list otagexps */
854
	d = son(bro(son(d))); /* list otagexps */
846
	while(n !=0) { d = bro(d); n--;}
855
	while (n !=0) { d = bro(d); n--;}
847
	Assert(name(d)==caller_tag);
856
	Assert(name(d) ==caller_tag);
848
	return d;
857
	return d;
849
}
858
}
850
 
859
 
851
makeans make_code
860
makeans make_code
852
    PROTO_N ( (e, sp, dest, exitlab) )
-
 
853
    PROTO_T ( exp e X space sp X where dest X int exitlab )
861
(exp e, space sp, where dest, int exitlab)
854
{
862
{
855
  /* produce code for expression e, putting its result in dest using
863
  /* produce code for expression e, putting its result in dest using
856
     t-regs given by sp. If non-zero, exitlab is the label of where the
864
     t-regs given by sp. If non-zero, exitlab is the label of where the
857
     code is to continue */
865
     code is to continue */
858
  long  constval;
866
  long  constval;
Line 861... Line 869...
861
  mka.lab = exitlab;
869
  mka.lab = exitlab;
862
  mka.regmove = NOREG;
870
  mka.regmove = NOREG;
863
 
871
 
864
 
872
 
865
 
873
 
866
  switch (name (e)) {
874
  switch (name(e)) {
867
    case ident_tag:
875
    case ident_tag:
868
      {
876
      {
869
	where placew;
877
	where placew;
870
	int   r = NOREG;
878
	int   r = NOREG;
871
	bool remember = 0;
879
	bool remember = 0;
Line 875... Line 883...
875
 
883
 
876
	if (props (e) & defer_bit) {/* the tag of this declaration is
884
	if (props (e) & defer_bit) {/* the tag of this declaration is
877
				   transparently identified with its
885
				   transparently identified with its
878
				   definition, without reserving more
886
				   definition, without reserving more
879
				   space */
887
				   space */
880
	  e = bro (son (e));
888
	  e = bro(son(e));
881
	  goto tailrecurse;
889
	  goto tailrecurse;
882
 
890
 
883
	}
891
	}
884
 
892
 
885
 
893
 
Line 890... Line 898...
890
	}
898
	}
891
        else
899
        else
892
	if (name(son(e)) == caller_name_tag) {
900
	if (name(son(e)) == caller_name_tag) {
893
		exp ote = find_ote(e,no(son(e)));
901
		exp ote = find_ote(e,no(son(e)));
894
		long disp = no(ote);
902
		long disp = no(ote);
895
		no(e) = (disp<<1)+29;
903
		no(e) = (disp<<1) +29;
896
		placew = nowhere;
904
		placew = nowhere;
897
	}
905
	}
898
	else {
906
	else {
899
	  ash a;
907
	  ash a;
900
	  int   n = no (e);
908
	  int   n = no(e);
901
	  a = ashof (sh (son (e)));
909
	  a = ashof(sh(son(e)));
902
	  if ((props (e) & inreg_bits) != 0) {
910
	  if ((props(e) & inreg_bits)!= 0) {
903
	    /* tag in some fixed pt reg */
911
	    /* tag in some fixed pt reg */
904
	    if (n == 0) {	/* if it hasn't been already allocated
912
	    if (n == 0) {	/* if it hasn't been already allocated
905
				   into a s-reg (or r2) allocate tag into
913
				   into a s-reg (or r2) allocate tag into
906
				   fixed t-reg ... */
914
				   fixed t-reg ... */
907
	      int   s = sp.fixed;
915
	      int   s = sp.fixed;
908
	      if (props (e) & notparreg)/* ... but not a parameter reg */
916
	      if (props (e) & notparreg)/* ... but not a parameter reg */
909
		s |= 0xf0;
917
		s |= 0xf0;
910
	      n = getreg (s);
918
	      n = getreg(s);
911
	      no (e) = n;
919
	      no(e) = n;
912
	    }
920
	    }
913
	    setregalt (placew.answhere, n);
921
	    setregalt(placew.answhere, n);
914
	  }
922
	  }
915
	  else
923
	  else
916
	    if ((props (e) & infreg_bits) != 0) {
924
	    if ((props(e) & infreg_bits)!= 0) {
917
	      /* tag in some float reg */
925
	      /* tag in some float reg */
918
	      freg frg;
926
	      freg frg;
919
	      if (n == 0) {	/* if it hasn't been already allocated
927
	      if (n == 0) {	/* if it hasn't been already allocated
920
				   into a s-reg (or r0) allocate tag into
928
				   into a s-reg (or r0) allocate tag into
921
				   float-reg ... */
929
				   float-reg ... */
922
		int   s = sp.flt;
930
		int   s = sp.flt;
923
		if (props (e) & notparreg)
931
		if (props(e) & notparreg)
924
		  s |= 0xc0;
932
		  s |= 0xc0;
925
		n = getfreg (s);
933
		n = getfreg(s);
926
		no (e) = n;
934
		no(e) = n;
927
	      }
935
	      }
928
	      else
936
	      else
929
	      if (n == 16) {	/* result reg */
937
	      if (n == 16) {	/* result reg */
930
		  n = 0;
938
		  n = 0;
931
		  no (e) = 0;
939
		  no(e) = 0;
932
	      }
940
	      }
933
 
941
 
934
 
942
 
935
	      frg.fr = n;
943
	      frg.fr = n;
936
	      frg.dble = (a.ashsize == 64) ? 1 : 0;
944
	      frg.dble = (a.ashsize == 64)? 1 : 0;
937
	      setfregalt (placew.answhere, frg);
945
	      setfregalt(placew.answhere, frg);
938
	    }
946
	    }
939
	    else
947
	    else
940
	    if (isparam(e) ) {
948
	    if (isparam(e)) {
941
	      if(name(son(e))!=formal_callee_tag) {
949
	      if (name(son(e))!=formal_callee_tag) {
942
	    	long n = (no(son(e)) + frame_size +callee_size)>>3 ; /* byte disp of params */
950
	    	long n = (no(son(e)) + frame_size +callee_size)>>3 ; /* byte disp of params */
943
		instore is;
951
		instore is;
944
		is.adval =1;
952
		is.adval =1;
945
		no(e) = ((no(son(e))+frame_size+callee_size-locals_offset)<<1)+29+Has_fp;
953
		no(e) = ((no(son(e)) +frame_size+callee_size-locals_offset) <<1) +29+Has_fp;
946
		if ((!Has_no_vcallers ||
954
		if ((!Has_no_vcallers ||
947
			(isvis(e) && props(son(e)) != 0)) && last_param(e) ){
955
			(isvis(e) && props(son(e))!= 0)) && last_param(e)) {
948
		        /* vararg in reg ? */
956
		        /* vararg in reg ? */
949
			int r = rounder(no(son(e))+shape_size(sh(son(e))), 32);
957
			int r = rounder(no(son(e)) +shape_size(sh(son(e))), 32);
950
			while(r<=96) {
958
			while (r<=96) {
951
				is.b.offset = (r+((Has_fp)?0
959
				is.b.offset = (r+ ((Has_fp)?0
952
						:frame_size+callee_size))>>3;
960
						:frame_size+callee_size)) >>3;
953
				is.b.base = 29+Has_fp;
961
				is.b.base = 29+Has_fp;
954
				ls_ins(i_sw, 4+(r>>5), is.b);
962
				ls_ins(i_sw, 4+ (r>>5), is.b);
955
				r+=32;
963
				r+=32;
956
		        }
964
		        }
957
		}
965
		}
958
		if (shape_size(sh(son(e)))==0) {
966
		if (shape_size(sh(son(e))) ==0) {
959
			/* vararg ... param */
967
			/* vararg ... param */
960
			e = bro(son(e));
968
			e = bro(son(e));
961
			goto tailrecurse;
969
			goto tailrecurse;
962
		}
970
		}
963
		is.b.offset = (Has_fp)? (no(son(e))>>3):n;
971
		is.b.offset = (Has_fp)?(no(son(e)) >>3):n;
964
		is.b.base = 29 + Has_fp;
972
		is.b.base = 29 + Has_fp;
965
		if (BIGEND && props(son(e)) != 0 && shape_size(sh(son(e)))<32) {
973
		if (BIGEND && props(son(e))!= 0 && shape_size(sh(son(e))) <32) {
966
			is.b.offset += (shape_size(sh(son(e)))==8)?3:2;
974
			is.b.offset += (shape_size(sh(son(e))) ==8)?3:2;
967
			/* short promotions */
975
			/* short promotions */
968
		}
976
		}
969
		setinsalt(placew.answhere, is);
977
		setinsalt(placew.answhere, is);
970
		remember =1;
978
		remember =1;
971
	      }
979
	      }
972
	      else {
980
	      else {
973
	      	no(e) = ( ( no(son(e)) +frame_size - locals_offset)<<1)
981
	      	no(e) = ((no(son(e)) +frame_size - locals_offset) <<1)
974
	      	        + ((Has_vcallees)?local_reg:30);
982
	      	        + ((Has_vcallees)?local_reg:30);
975
		placew = nowhere;
983
		placew = nowhere;
976
	      }
984
	      }
977
	    }
985
	    }
978
	    else {		/* allocate on stack */
986
	    else {		/* allocate on stack */
979
	      int   base = n & 0x3f;
987
	      int   base = n & 0x3f;
980
	      instore is;
988
	      instore is;
981
	      is.b.base = base;
989
	      is.b.base = base;
982
	      is.b.offset = (n - base) >> 4;
990
	      is.b.offset = (n - base) >> 4;
983
	      is.adval = 1;
991
	      is.adval = 1;
984
	      if (base == 29 ) {
992
	      if (base == 29) {
985
		is.b.offset += locals_offset >> 3;
993
		is.b.offset += locals_offset >> 3;
986
	      }
994
	      }
987
	      else
995
	      else
988
	      if ((base==30 && Has_fp) ) {
996
	      if ((base==30 && Has_fp)) {
989
		is.b.offset += ((locals_offset-frame_size-callee_size) >> 3);
997
		is.b.offset += ((locals_offset-frame_size-callee_size) >> 3);
990
	      }
998
	      }
991
	      else
999
	      else
992
	      if ( (base == local_reg && Has_vcallees)) {
1000
	      if ((base == local_reg && Has_vcallees)) {
993
		is.b.offset += ((locals_offset -frame_size) >> 3);
1001
		is.b.offset += ((locals_offset -frame_size) >> 3);
994
	      }
1002
	      }
995
	      setinsalt (placew.answhere, is);
1003
	      setinsalt(placew.answhere, is);
996
	      remember = 1;
1004
	      remember = 1;
997
	    }
1005
	    }
998
	  placew.ashwhere = a;
1006
	  placew.ashwhere = a;
999
	}
1007
	}
1000
        if (isparam(e)
1008
        if (isparam(e)
1001
        	&& name(son(e))!=formal_callee_tag) {
1009
        	&& name(son(e))!=formal_callee_tag) {
1002
          exp se = son(e);
1010
          exp se = son(e);
1003
          exp d = e;
1011
          exp d = e;
1004
	   /* parameter fiddles */
1012
	   /* parameter fiddles */
1005
           if (props(se) == 0 && (props(d) & inanyreg) !=0) {
1013
           if (props(se) == 0 && (props(d) & inanyreg)!=0) {
1006
                /* not originally in required reg */
1014
                /* not originally in required reg */
1007
                ans a;
1015
                ans a;
1008
                instore is;
1016
                instore is;
1009
		is.b.base = 29 + Has_fp;
1017
		is.b.base = 29 + Has_fp;
1010
		is.b.offset = (no(se) +
1018
		is.b.offset = (no(se) +
1011
                               ((Has_fp)?0:(frame_size+callee_size)))>>3;
1019
                              ((Has_fp)?0:(frame_size+callee_size))) >>3;
1012
                is.adval = 0;
1020
                is.adval = 0;
1013
		if (BIGEND && shape_size(sh(son(e)))<32) {
1021
		if (BIGEND && shape_size(sh(son(e))) <32) {
1014
			is.b.offset += (shape_size(sh(son(e)))==8)?3:2;
1022
			is.b.offset += (shape_size(sh(son(e))) ==8)?3:2;
1015
			/* short promotions */
1023
			/* short promotions */
1016
		}
1024
		}
1017
                setinsalt(a, is);
1025
                setinsalt(a, is);
1018
                IGNORE move(a, placew, sp, is_signed(sh(se)));
1026
                IGNORE move(a, placew, sp, is_signed(sh(se)));
1019
           }
1027
           }
1020
           else
1028
           else
1021
           if (props(se) !=0 && (props(d) & inanyreg) ==0) {
1029
           if (props(se)!=0 && (props(d) & inanyreg) ==0) {
1022
                /* originally in reg and required in store */
1030
                /* originally in reg and required in store */
1023
                ans a;
1031
                ans a;
1024
                if (is_floating(name(sh(se))) ) {
1032
                if (is_floating(name(sh(se)))) {
1025
                   freg fr;
1033
                   freg fr;
1026
                   fr.fr = props(se);
1034
                   fr.fr = props(se);
1027
                   fr.dble = (name(sh(se)) != shrealhd);
1035
                   fr.dble = (name(sh(se))!= shrealhd);
1028
                   setfregalt(a, fr);
1036
                   setfregalt(a, fr);
1029
                }
1037
                }
1030
                else { setregalt(a, props(se)); }
1038
                else { setregalt(a, props(se)); }
1031
                r = move(a, placew, sp, 0);
1039
                r = move(a, placew, sp, 0);
1032
           }
1040
           }
1033
           else
1041
           else
1034
           if (props(se) !=0 && props(se) != no(d) ) {
1042
           if (props(se)!=0 && props(se)!= no(d)) {
1035
                /* in wrong register */
1043
                /* in wrong register */
1036
                int sr = no(d);
1044
                int sr = no(d);
1037
                int tr = props(se);
1045
                int tr = props(se);
1038
                if (is_floating(name(sh(se))) ) {
1046
                if (is_floating(name(sh(se)))) {
1039
                   if ((fltdone & (3<<(sr<<1))) != 0) {
1047
                   if ((fltdone & (3<< (sr<<1)))!= 0) {
1040
                        rrfp_ins( (name(sh(se)) != shrealhd) ? i_mov_d: i_mov_s,
1048
                        rrfp_ins((name(sh(se))!= shrealhd)? i_mov_d: i_mov_s,
1041
                                no(d)<<1, props(se)<<1 );
1049
                                no(d) <<1, props(se) <<1);
1042
                   }
1050
                   }
1043
                   else {
1051
                   else {
1044
                       props(se) = sr; no(d)= tr;
1052
                       props(se) = sr; no(d) = tr;
1045
                       sp = guardfreg(tr, sp);
1053
                       sp = guardfreg(tr, sp);
1046
                       /* !? swopped and moved in  dump_tag !? */
1054
                       /* !? swopped and moved in  dump_tag !? */
1047
                   }
1055
                   }
1048
                }
1056
                }
1049
                else {
1057
                else {
1050
                   if ( (fixdone & (1<<sr)) !=0 ) {
1058
                   if ((fixdone & (1<<sr))!=0) {
1051
                        mon_ins(i_move, no(d), props(se) );
1059
                        mon_ins(i_move, no(d), props(se));
1052
                   }
1060
                   }
1053
                   else {
1061
                   else {
1054
                       props(se) = sr; no(d)= tr;
1062
                       props(se) = sr; no(d) = tr;
1055
                       sp = guardreg(tr,sp);
1063
                       sp = guardreg(tr,sp);
1056
                        /* !? swopped for dump_tag !? */
1064
                        /* !? swopped for dump_tag !? */
1057
                   }
1065
                   }
1058
                }
1066
                }
1059
           }
1067
           }
1060
           /* maybe more about promotions */
1068
           /* maybe more about promotions */
1061
 
1069
 
1062
        }
1070
        }
1063
        else
1071
        else
1064
        if (isparam(e) && name(son(e))==formal_callee_tag) {
1072
        if (isparam(e) && name(son(e)) ==formal_callee_tag) {
1065
                exp se = son(e);
1073
                exp se = son(e);
1066
          	exp d = e;
1074
          	exp d = e;
1067
        	if ((props(d) & inanyreg) != 0) {
1075
        	if ((props(d) & inanyreg)!= 0) {
1068
        		/* callee parameter assigned to reg */
1076
        		/* callee parameter assigned to reg */
1069
        	ans a;
1077
        	ans a;
1070
                instore is;
1078
                instore is;
1071
		if (Has_vcallees) {
1079
		if (Has_vcallees) {
1072
			is.b.base = local_reg;
1080
			is.b.base = local_reg;
1073
			is.b.offset = (no(se))>>3;
1081
			is.b.offset = (no(se)) >>3;
1074
		}
1082
		}
1075
		else {
1083
		else {
1076
			is.b.base = 30;
1084
			is.b.base = 30;
1077
                	is.b.offset = (no(se) - callee_size)>>3;
1085
                	is.b.offset = (no(se) - callee_size) >>3;
1078
		}
1086
		}
1079
                is.adval = 0;
1087
                is.adval = 0;
1080
                setinsalt(a, is);
1088
                setinsalt(a, is);
1081
                IGNORE move(a, placew, sp, is_signed(sh(se)));
1089
                IGNORE move(a, placew, sp, is_signed(sh(se)));
1082
               }
1090
               }
1083
        }
1091
        }
1084
        else
1092
        else
1085
	  r = code_here (son (e), sp, placew);
1093
	  r = code_here(son(e), sp, placew);
1086
		/* evaluate the initialisation of tag, putting it into place
1094
		/* evaluate the initialisation of tag, putting it into place
1087
	   		allocated ... */
1095
	   		allocated ... */
1088
 
1096
 
1089
	if (remember && r != NOREG && pt (e) != nilexp && no(pt(e))==0
1097
	if (remember && r != NOREG && pt(e)!= nilexp && no(pt(e)) ==0
1090
	    && eq_sze (sh (son (e)), sh (pt (e)))) {
1098
	    && eq_sze(sh(son(e)), sh(pt(e)))) {
1091
	  /* ...if it was temporarily in a register, remember it */
1099
	  /* ...if it was temporarily in a register, remember it */
1092
	  if (isvar (e)) {
1100
	  if (isvar(e)) {
1093
	    keepcont (pt (e), r);
1101
	    keepcont(pt(e), r);
1094
	  }
1102
	  }
1095
	  else {
1103
	  else {
1096
	    keepreg (pt (e), r);
1104
	    keepreg(pt(e), r);
1097
	  }
1105
	  }
1098
	}
1106
	}
1099
 
1107
 
1100
 
1108
 
1101
	sp =  guard (placew, sp);
1109
	sp =  guard(placew, sp);
1102
        e = bro (son (e));
1110
        e = bro(son(e));
1103
        goto tailrecurse;
1111
        goto tailrecurse;
1104
	/* and evaluate the body of the declaration */
1112
	/* and evaluate the body of the declaration */
1105
      }				/* end ident */
1113
      }				/* end ident */
1106
 
1114
 
1107
    case clear_tag: {
1115
    case clear_tag: {
Line 1113... Line 1121...
1113
 
1121
 
1114
 
1122
 
1115
 
1123
 
1116
    case seq_tag:
1124
    case seq_tag:
1117
      {
1125
      {
1118
	exp t = son (son (e));
1126
	exp t = son(son(e));
1119
	for (;;) {
1127
	for (;;) {
1120
	  exp next = (last (t)) ? (bro (son (e))) : bro (t);
1128
	  exp next = (last(t))?(bro(son(e))): bro(t);
1121
	  if (name (next) == goto_tag) {/* gotos end sequences */
1129
	  if (name (next) == goto_tag) {/* gotos end sequences */
1122
	    make_code (t, sp, nowhere, no (son (pt (next))));
1130
	    make_code(t, sp, nowhere, no(son(pt(next))));
1123
	  }
1131
	  }
1124
	  else {
1132
	  else {
1125
	    code_here (t, sp, nowhere);
1133
	    code_here(t, sp, nowhere);
1126
	  }
1134
	  }
1127
	  if (last (t)) {
1135
	  if (last(t)) {
1128
	    e = bro (son (e));
1136
	    e = bro(son(e));
1129
	    goto tailrecurse;
1137
	    goto tailrecurse;
1130
	  }
1138
	  }
1131
	  t = bro (t);
1139
	  t = bro(t);
1132
	}
1140
	}
1133
      }				/* end seq */
1141
      }				/* end seq */
1134
 
1142
 
1135
    case cond_tag:
1143
    case cond_tag:
1136
      {
1144
      {
1137
	exp first = son (e);
1145
	exp first = son(e);
1138
	exp second = bro (son (e));
1146
	exp second = bro(son(e));
1139
	exp test;
1147
	exp test;
1140
 
1148
 
1141
	if (dest.answhere.discrim == insomereg) {
1149
	if (dest.answhere.discrim == insomereg) {
1142
	  /* must make choice of register to contain answer to cond */
1150
	  /* must make choice of register to contain answer to cond */
1143
	  int  *sr = someregalt (dest.answhere);
1151
	  int  *sr = someregalt(dest.answhere);
1144
	  if (*sr != -1) {
1152
	  if (*sr != -1) {
1145
	    failer ("Somereg *2");
1153
	    failer("Somereg *2");
1146
	  }
1154
	  }
1147
	  *sr = getreg (sp.fixed);
1155
	  *sr = getreg(sp.fixed);
1148
	  setregalt (dest.answhere, *sr);
1156
	  setregalt(dest.answhere, *sr);
1149
	}
1157
	}
1150
	else
1158
	else
1151
	if (dest.answhere.discrim == insomefreg) {
1159
	if (dest.answhere.discrim == insomefreg) {
1152
	       somefreg sfr;
1160
	       somefreg sfr;
1153
	       freg fr;
1161
	       freg fr;
1154
   	       sfr = somefregalt(dest.answhere);
1162
   	       sfr = somefregalt(dest.answhere);
1155
	       if (*sfr.fr != -1) { failer ("Somefreg *2"); }
1163
	       if (*sfr.fr != -1) { failer("Somefreg *2"); }
1156
	       *sfr.fr = getfreg(sp.flt);
1164
	       *sfr.fr = getfreg(sp.flt);
1157
	       fr.fr = *sfr.fr;
1165
	       fr.fr = *sfr.fr;
1158
	       fr.dble = sfr.dble;
1166
	       fr.dble = sfr.dble;
1159
	       setfregalt(dest.answhere, fr);
1167
	       setfregalt(dest.answhere, fr);
1160
	}
1168
	}
1161
 
1169
 
1162
	if (name (first) == goto_tag && pt (first) == second) {
1170
	if (name(first) == goto_tag && pt(first) == second) {
1163
	  /* first is goto second */
1171
	  /* first is goto second */
1164
	  no (son (second)) = 0;
1172
	  no(son(second)) = 0;
1165
	  return make_code (second, sp, dest, exitlab);
1173
	  return make_code(second, sp, dest, exitlab);
1166
	}
1174
	}
1167
	else
1175
	else
1168
	    if (name (second) == labst_tag &&
1176
	    if (name(second) == labst_tag &&
1169
		name (bro (son (second))) == top_tag) {
1177
		name(bro(son(second))) == top_tag) {
1170
	      /* second is empty */
1178
	      /* second is empty */
1171
	      int   endl = (exitlab == 0) ? new_label () : exitlab;
1179
	      int   endl = (exitlab == 0)? new_label(): exitlab;
1172
	      no (son (second)) = endl;
1180
	      no(son(second)) = endl;
1173
	      make_code (first, sp, dest, endl);
1181
	      make_code(first, sp, dest, endl);
1174
	      mka.lab = endl;
1182
	      mka.lab = endl;
1175
	      return mka;
1183
	      return mka;
1176
	    }
1184
	    }
1177
	    else
1185
	    else
1178
	      if (name (second) == labst_tag &&
1186
	      if (name(second) == labst_tag &&
1179
		  name (bro (son (second))) == goto_tag) {
1187
		  name(bro(son(second))) == goto_tag) {
1180
		/* second is goto */
1188
		/* second is goto */
1181
		exp g = bro (son (second));
1189
		exp g = bro(son(second));
1182
		no (son (second)) = no (son (pt (g)));
1190
		no(son(second)) = no(son(pt(g)));
1183
		return make_code (first, sp, dest, exitlab);
1191
		return make_code(first, sp, dest, exitlab);
1184
	      }
1192
	      }
1185
	if (test = testlast (first, second) /* I mean it */ ) {
1193
	if (test = testlast (first, second) /* I mean it */ ) {
1186
	  /* effectively an empty then part */
1194
	  /* effectively an empty then part */
1187
	  int   l = (exitlab != 0) ? exitlab : new_label ();
1195
	  int   l = (exitlab != 0)? exitlab : new_label();
1188
	  bool rev = IsRev(test);
1196
	  bool rev = IsRev(test);
1189
	  ptno(test) = -l;	/* make test jump to exitlab - see
1197
	  ptno(test) = -l;	/* make test jump to exitlab - see
1190
				   test_tag: */
1198
				   test_tag: */
1191
	  props (test) = notbranch[(props (test)&127) - 1];
1199
	  props(test) = notbranch[(props(test) &127) - 1];
1192
	   if (rev) { SetRev(test); }
1200
	   if (rev) { SetRev(test); }
1193
	  /* ... with inverse test */
1201
	  /* ... with inverse test */
1194
	  no (son (second)) = new_label ();
1202
	  no(son(second)) = new_label();
1195
	  make_code (first, sp, dest, l);
1203
	  make_code(first, sp, dest, l);
1196
	  make_code (second, sp, dest, l);
1204
	  make_code(second, sp, dest, l);
1197
	  mka.lab = l;
1205
	  mka.lab = l;
1198
	  return mka;
1206
	  return mka;
1199
	}
1207
	}
1200
	else {
1208
	else {
1201
	  int   fl;
1209
	  int   fl;
1202
	  no (son (second)) = new_label ();
1210
	  no(son(second)) = new_label();
1203
	  fl = make_code (first, sp, dest, exitlab).lab;
1211
	  fl = make_code(first, sp, dest, exitlab).lab;
1204
 
1212
 
1205
	  {
1213
	  {
1206
	    int   l = (fl != 0) ? fl : ((exitlab != 0) ? exitlab : new_label ());
1214
	    int   l = (fl != 0)? fl :((exitlab != 0)? exitlab : new_label());
1207
/* Alteration 4 */
1215
/* Alteration 4 */
1208
	    if (name(sh(first))!= bothd || l == rscope_label) uncond_ins (i_b, l);
1216
	    if (name(sh(first))!= bothd || l == rscope_label)uncond_ins(i_b, l);
1209
	    make_code (second, sp, dest, l);
1217
	    make_code(second, sp, dest, l);
1210
	    clear_all ();
1218
	    clear_all();
1211
	    mka.lab = l;
1219
	    mka.lab = l;
1212
	    return mka;
1220
	    return mka;
1213
	  }
1221
	  }
1214
	}
1222
	}
1215
      }				/* end cond */
1223
      }				/* end cond */
1216
 
1224
 
1217
    case labst_tag:
1225
    case labst_tag:
1218
      {
1226
      {
1219
	if (no (son (e)) != 0) {
1227
	if (no(son(e))!= 0) {
1220
	   set_label (no (son (e)));
1228
	   set_label(no(son(e)));
1221
	}
1229
	}
1222
	if (is_loaded_lv(e) && No_S) { /* can be target of long_jump; reset sp */
1230
	if (is_loaded_lv(e) && No_S) { /* can be target of long_jump; reset sp */
1223
		baseoff b;
1231
		baseoff b;
1224
		b.base = 30;
1232
		b.base = 30;
1225
		if (Has_vcallees) {
1233
		if (Has_vcallees) {
Line 1229... Line 1237...
1229
		if (Has_tos) {
1237
		if (Has_tos) {
1230
			b.offset = -8;
1238
			b.offset = -8;
1231
			ls_ins(i_lw, 29, b);
1239
			ls_ins(i_lw, 29, b);
1232
		}
1240
		}
1233
		else {
1241
		else {
1234
			rri_ins(i_subu, 29, 30, (frame_size+callee_size)>>3);
1242
			rri_ins(i_subu, 29, 30,(frame_size+callee_size) >>3);
1235
		}
1243
		}
1236
	}
1244
	}
1237
	e = bro (son (e));
1245
	e = bro(son(e));
1238
	goto tailrecurse;
1246
	goto tailrecurse;
1239
 
1247
 
1240
      }				/* end labst */
1248
      }				/* end labst */
1241
 
1249
 
1242
    case rep_tag:
1250
    case rep_tag:
1243
      {
1251
      {
1244
	exp first = son (e);
1252
	exp first = son(e);
1245
	exp second = bro (first);
1253
	exp second = bro(first);
1246
/* Alteration 1: adds this line :- */
1254
/* Alteration 1: adds this line :- */
1247
	code_here(first, sp, nowhere);
1255
	code_here(first, sp, nowhere);
1248
	no (son (second)) = new_label ();
1256
	no(son(second)) = new_label();
1249
	e = second;
1257
	e = second;
1250
	goto tailrecurse;
1258
	goto tailrecurse;
1251
 
1259
 
1252
      }				/* end rep */
1260
      }				/* end rep */
1253
 
1261
 
1254
    case goto_tag:
1262
    case goto_tag:
1255
      {
1263
      {
1256
	exp gotodest = pt(e);
1264
	exp gotodest = pt(e);
1257
	int   lab = no (son (gotodest));
1265
	int   lab = no(son(gotodest));
1258
	clear_all ();
1266
	clear_all();
1259
	if (!last(e) || name(bro(e))!=seq_tag || !last(bro(e)) ||
1267
	if (!last(e) || name(bro(e))!=seq_tag || !last(bro(e)) ||
1260
	      last(bro(bro(e))) || bro(bro(bro(e))) != gotodest) {
1268
	      last(bro(bro(e))) || bro(bro(bro(e)))!= gotodest) {
1261
	  uncond_ins (i_b, lab);
1269
	  uncond_ins(i_b, lab);
1262
	} /* dest is next in sequence */
1270
	} /* dest is next in sequence */
1263
 
1271
 
1264
	return mka;
1272
	return mka;
1265
      }				/* end goto */
1273
      }				/* end goto */
1266
 
1274
 
Line 1269... Line 1277...
1269
    	ans aa;
1277
    	ans aa;
1270
    	condr_ins(i_la, r, no(son(pt(e))) ); /*???? */
1278
    	condr_ins(i_la, r, no(son(pt(e))) ); /*???? */
1271
    	setregalt(aa,r);
1279
    	setregalt(aa,r);
1272
    	move(aa,dest, guardreg(r,sp), 0);
1280
    	move(aa,dest, guardreg(r,sp), 0);
1273
    	mka.regmove = r;
1281
    	mka.regmove = r;
1274
    	return mka;
1282
    	return mka;
1275
    }
1283
    }
1276
 
1284
 
1277
    case long_jump_tag: {
1285
    case long_jump_tag: {
1278
    	int fp = reg_operand(son(e), sp);
1286
    	int fp = reg_operand(son(e), sp);
1279
    	int labval = reg_operand(bro(son(e)), sp);
1287
    	int labval = reg_operand(bro(son(e)), sp);
1280
    	mon_ins(i_move, 30, fp);
1288
    	mon_ins(i_move, 30, fp);
1281
    	br_ins(i_j, labval);
1289
    	br_ins(i_j, labval);
1282
    	return mka;
1290
    	return mka;
1283
    }
1291
    }
1284
 
1292
 
1285
    case max_tag: case min_tag: case offset_max_tag:
1293
    case max_tag: case min_tag: case offset_max_tag:
1286
      {
1294
      {
1287
	exp l = son (e);
1295
	exp l = son(e);
1288
	exp r = bro (l);
1296
	exp r = bro(l);
1289
	shape shl = sh(l);
1297
	shape shl = sh(l);
1290
	int a1, a2, d;
1298
	int a1, a2, d;
1291
	ans aa;
1299
	ans aa;
1292
	space nsp;
1300
	space nsp;
1293
	char * setins = sets(shl,3);
1301
	char * setins = sets(shl,3);
1294
	int lab = new_label();
1302
	int lab = new_label();
1295
 
1303
 
1296
	a1 = reg_operand(l, nsp);
1304
	a1 = reg_operand(l, nsp);
1297
	nsp = guardreg(a1, sp);
1305
	nsp = guardreg(a1, sp);
1298
	d = regfrmdest(&dest, nsp);
1306
	d = regfrmdest(&dest, nsp);
1299
	if (d==a1) d = getreg(nsp.fixed);
1307
	if (d==a1)d = getreg(nsp.fixed);
1300
	nsp = guardreg(d, nsp);
1308
	nsp = guardreg(d, nsp);
1301
	if (name(r)== val_tag) {
1309
	if (name(r) == val_tag) {
1302
		 rri_ins (setins, d, a1, no (r));
1310
		 rri_ins(setins, d, a1, no(r));
1303
	}
1311
	}
1304
	else {
1312
	else {
1305
	  	a2 = reg_operand (r, nsp);
1313
	  	a2 = reg_operand(r, nsp);
1306
		if (d==a2) d = getreg(guardreg(a2,nsp).fixed);
1314
		if (d==a2)d = getreg(guardreg(a2,nsp).fixed);
1307
		rrr_ins (setins, d, a1, a2);
1315
		rrr_ins(setins, d, a1, a2);
1308
	}
1316
	}
1309
 
1317
 
1310
	setnoreorder();
1318
	setnoreorder();
1311
	condri_ins((name(e)!=min_tag)?i_beq:i_bne, d, 0, lab);
1319
	condri_ins((name(e)!=min_tag)?i_beq:i_bne, d, 0, lab);
1312
	rrr_ins(i_addu, d, a1, 0);
1320
	rrr_ins(i_addu, d, a1, 0);
1313
	if (name(r)==val_tag) {
1321
	if (name(r) ==val_tag) {
1314
		baseoff b;
1322
		baseoff b;
1315
		b.base = 0;
1323
		b.base = 0;
1316
		b.offset = no(r);
1324
		b.offset = no(r);
1317
		ls_ins(i_li, d, b);
1325
		ls_ins(i_li, d, b);
1318
	}
1326
	}
1319
	else rrr_ins(i_addu,d,a2, 0);
1327
	else rrr_ins(i_addu,d,a2, 0);
1320
	set_label_no_clear(lab);
1328
	set_label_no_clear(lab);
1321
	setreorder();
1329
	setreorder();
1322
 
1330
 
1323
	setregalt (aa, d);
1331
	setregalt(aa, d);
1324
        move (aa, dest, guardreg (d, sp), 0);
1332
        move(aa, dest, guardreg(d, sp), 0);
1325
        mka.regmove = d;
1333
        mka.regmove = d;
1326
        return mka;
1334
        return mka;
1327
 
1335
 
1328
 
1336
 
1329
      }
1337
      }
1330
 
1338
 
1331
 
1339
 
1332
    case absbool_tag: case maxlike_tag: case minlike_tag: case abslike_tag:
1340
    case absbool_tag: case maxlike_tag: case minlike_tag: case abslike_tag:
1333
      {
1341
      {
1334
	exp l = son (son (e));
1342
	exp l = son(son(e));
1335
	exp r = bro (l);
1343
	exp r = bro(l);
1336
	shape shl = sh (l);
1344
	shape shl = sh(l);
1337
	char *setins;
1345
	char *setins;
1338
	int   n = props (son (e));
1346
	int   n = props(son(e));
1339
	int   d;
1347
	int   d;
1340
	int   a1;
1348
	int   a1;
1341
	int   a2;
1349
	int   a2;
1342
	bool xlike = (name(e) != absbool_tag);
1350
	bool xlike = (name(e)!= absbool_tag);
1343
	ans aa;
1351
	ans aa;
1344
 
1352
 
1345
	if (!xlike && name (l) == val_tag) {/* put literal operand on right */
1353
	if (!xlike && name (l) == val_tag) {/* put literal operand on right */
1346
	  exp temp = l;
1354
	  exp temp = l;
1347
	  l = r;
1355
	  l = r;
Line 1360... Line 1368...
1360
 
1368
 
1361
	d = regfrmdest(&dest, sp);
1369
	d = regfrmdest(&dest, sp);
1362
 
1370
 
1363
	/* reg d will contain result of set (eventually) */
1371
	/* reg d will contain result of set (eventually) */
1364
 
1372
 
1365
	a1 = reg_operand (l, sp);
1373
	a1 = reg_operand(l, sp);
1366
	if (xlike && a1==d) {
1374
	if (xlike && a1==d) {
1367
		sp = guardreg(a1, sp);
1375
		sp = guardreg(a1, sp);
1368
		d = getreg(sp.fixed);
1376
		d = getreg(sp.fixed);
1369
	}
1377
	}
1370
	if (name (r) == val_tag) {
1378
	if (name(r) == val_tag) {
1371
	  rri_ins (setins, d, a1, no (r));
1379
	  rri_ins(setins, d, a1, no(r));
1372
	}
1380
	}
1373
	else {
1381
	else {
1374
	  space nsp;
1382
	  space nsp;
1375
	  nsp = guardreg (a1, sp);
1383
	  nsp = guardreg(a1, sp);
1376
	  a2 = reg_operand (r, nsp);
1384
	  a2 = reg_operand(r, nsp);
1377
	  if (xlike && a2==d) {
1385
	  if (xlike && a2==d) {
1378
	  	nsp = guardreg(a2, nsp);
1386
	  	nsp = guardreg(a2, nsp);
1379
	  	d = getreg(nsp.fixed);
1387
	  	d = getreg(nsp.fixed);
1380
	  }
1388
	  }
1381
	  rrr_ins (setins, d, a1, a2);
1389
	  rrr_ins(setins, d, a1, a2);
1382
	}
1390
	}
1383
	if (name(e)==maxlike_tag || name(e)==minlike_tag) {
1391
	if (name(e) ==maxlike_tag || name(e) ==minlike_tag) {
1384
		int l = new_label();
1392
		int l = new_label();
1385
		setnoreorder();
1393
		setnoreorder();
1386
		condri_ins((name(e)==maxlike_tag)?i_bne:i_beq, d, 0, l);
1394
		condri_ins((name(e) ==maxlike_tag)?i_bne:i_beq, d, 0, l);
1387
		rrr_ins(i_addu, d, a1, 0);
1395
		rrr_ins(i_addu, d, a1, 0);
1388
		if (name(r)==val_tag) {
1396
		if (name(r) ==val_tag) {
1389
			baseoff b;
1397
			baseoff b;
1390
			b.base = 0;
1398
			b.base = 0;
1391
			b.offset = no(r);
1399
			b.offset = no(r);
1392
			ls_ins(i_li, d, b);
1400
			ls_ins(i_li, d, b);
1393
		}
1401
		}
1394
		else rrr_ins(i_addu,d,a2, 0);
1402
		else rrr_ins(i_addu,d,a2, 0);
1395
		set_label_no_clear(l);
1403
		set_label_no_clear(l);
1396
		setreorder();
1404
		setreorder();
1397
	}
1405
	}
1398
	else
1406
	else
1399
	if (name(e)==abslike_tag) {
1407
	if (name(e) ==abslike_tag) {
1400
		int l = new_label();
1408
		int l = new_label();
1401
		setnoreorder();
1409
		setnoreorder();
1402
		condri_ins(i_bne, d, 0, l);
1410
		condri_ins(i_bne, d, 0, l);
1403
		rrr_ins(i_addu, d, a1, 0);
1411
		rrr_ins(i_addu, d, a1, 0);
1404
		rrr_ins(i_subu, d, 0, a1);
1412
		rrr_ins(i_subu, d, 0, a1);
Line 1406... Line 1414...
1406
		setreorder();
1414
		setreorder();
1407
	}
1415
	}
1408
 
1416
 
1409
 
1417
 
1410
 
1418
 
1411
        setregalt (aa, d);
1419
        setregalt(aa, d);
1412
        move (aa, dest, guardreg (d, sp), 0);
1420
        move(aa, dest, guardreg(d, sp), 0);
1413
        mka.regmove = d;
1421
        mka.regmove = d;
1414
        return mka;
1422
        return mka;
1415
 
1423
 
1416
 
1424
 
1417
      }				/* end absbool */
1425
      }				/* end absbool */
1418
 
1426
 
1419
 
1427
 
1420
    case test_tag:
1428
    case test_tag:
1421
      {
1429
      {
1422
	exp l = son (e);
1430
	exp l = son(e);
1423
	exp r = bro (l);
1431
	exp r = bro(l);
1424
	int   lab = (ptno (e) < 0) ? -ptno (e) : no (son (pt (e)));
1432
	int   lab = (ptno(e) < 0)? -ptno(e): no(son(pt(e)));
1425
	/* see frig in cond_tag */
1433
	/* see frig in cond_tag */
1426
	shape shl = sh (l);
1434
	shape shl = sh(l);
1427
	char *branch;
1435
	char *branch;
1428
	int   n = (props (e)) & 127; /* could have Rev bit in props*/
1436
	int   n = (props (e)) & 127; /* could have Rev bit in props*/
1429
 
1437
 
1430
	if (is_floating (name (sh (l)))) {
1438
	if (is_floating(name(sh(l)))) {
1431
	  bool dble = (name (shl) != shrealhd) ? 1 : 0;
1439
	  bool dble = (name(shl)!= shrealhd)? 1 : 0;
1432
	  int   a1;
1440
	  int   a1;
1433
	  char *branch = (n <= 2 || n == 6) ? i_bc1t : i_bc1f;
1441
	  char *branch = (n <= 2 || n == 6)? i_bc1t : i_bc1f;
1434
	  char *compare = (dble) ? fdbranches (n) : fbranches (n);
1442
	  char *compare = (dble)? fdbranches(n): fbranches(n);
1435
	  /* choose branch and compare instructions */
1443
	  /* choose branch and compare instructions */
1436
	  int   a2;
1444
	  int   a2;
1437
	  space nsp;
1445
	  space nsp;
1438
	  if (IsRev(e)) {
1446
	  if (IsRev(e)) {
1439
		a2 = freg_operand(r, sp);
1447
		a2 = freg_operand(r, sp);
Line 1442... Line 1450...
1442
	  }
1450
	  }
1443
	  else {
1451
	  else {
1444
		a1 = freg_operand(l, sp);
1452
		a1 = freg_operand(l, sp);
1445
		nsp = guardfreg(a1, sp);
1453
		nsp = guardfreg(a1, sp);
1446
		a2 = freg_operand(r, nsp);
1454
		a2 = freg_operand(r, nsp);
1447
	  }
1455
	  }
1448
 
1456
 
1449
	  rrfpcond_ins (compare, a1 << 1, a2 << 1);
1457
	  rrfpcond_ins(compare, a1 << 1, a2 << 1);
1450
	  br_ins (branch, lab);
1458
	  br_ins(branch, lab);
1451
	  return mka;
1459
	  return mka;
1452
	}			/* end float test */
1460
	}			/* end float test */
1453
	else {
1461
	else {
1454
	  int   a1;
1462
	  int   a1;
1455
	  int   a2;
1463
	  int   a2;
Line 1462... Line 1470...
1462
	    }
1470
	    }
1463
	    else
1471
	    else
1464
	      if (n <= 4) {
1472
	      if (n <= 4) {
1465
		n -= 2;
1473
		n -= 2;
1466
	      }
1474
	      }
1467
	  }
1475
	  }
1468
	  branch = branches(shl, n);
1476
	  branch = branches(shl, n);
1469
	  	/* choose branch instruction */
1477
	  	/* choose branch instruction */
1470
	  a1 = reg_operand (l, sp);
1478
	  a1 = reg_operand(l, sp);
1471
	  if (name (r) == val_tag) {
1479
	  if (name(r) == val_tag) {
1472
	    condri_ins (branch, a1, no (r), lab);
1480
	    condri_ins(branch, a1, no(r), lab);
1473
	  }
1481
	  }
1474
	  else {
1482
	  else {
1475
	    space nsp;
1483
	    space nsp;
1476
	    nsp = guardreg (a1, sp);
1484
	    nsp = guardreg(a1, sp);
1477
	    a2 = reg_operand (r, nsp);
1485
	    a2 = reg_operand(r, nsp);
1478
	    condrr_ins (branch, a1, a2, lab);
1486
	    condrr_ins(branch, a1, a2, lab);
1479
	  }
1487
	  }
1480
 
1488
 
1481
	  return mka;
1489
	  return mka;
1482
	}			/* end int test */
1490
	}			/* end int test */
1483
      }				/* end test */
1491
      }				/* end test */
1484
 
1492
 
1485
 
1493
 
1486
    case ass_tag:
1494
    case ass_tag:
1487
    case assvol_tag:
1495
    case assvol_tag:
1488
      {
1496
      {
1489
	exp lhs = son (e);
1497
	exp lhs = son(e);
1490
	exp rhs = bro (lhs);
1498
	exp rhs = bro(lhs);
1491
	where assdest;
1499
	where assdest;
1492
	space nsp;
1500
	space nsp;
1493
	ash arhs;
1501
	ash arhs;
1494
 
1502
 
1495
	int   contreg = NOREG;
1503
	int   contreg = NOREG;
1496
	if (name (e) == assvol_tag) {
1504
	if (name(e) == assvol_tag) {
1497
	  clear_all ();
1505
	  clear_all();
1498
	  setvolatile ();
1506
	  setvolatile();
1499
	}
1507
	}
1500
 
1508
 
1501
	arhs = ashof (sh (rhs));
1509
	arhs = ashof(sh(rhs));
1502
 
1510
 
1503
 
1511
 
1504
	if (name (e) == ass_tag && name (rhs) == apply_tag &&
1512
	if (name(e) == ass_tag && name(rhs) == apply_tag &&
1505
	    (is_floating (name (sh (rhs))) || valregable (sh (rhs)))) {
1513
	   (is_floating(name(sh(rhs))) || valregable(sh(rhs)))) {
1506
	  /* if source is simple proc call, evaluate it first and do
1514
	  /* if source is simple proc call, evaluate it first and do
1507
	     assignment */
1515
	     assignment */
1508
	  ans aa;
1516
	  ans aa;
1509
	  code_here (rhs, sp, nowhere);
1517
	  code_here(rhs, sp, nowhere);
1510
	  if (is_floating (name (sh (rhs)))) {
1518
	  if (is_floating(name(sh(rhs)))) {
1511
	    freg frg;
1519
	    freg frg;
1512
	    frg.fr = 0;
1520
	    frg.fr = 0;
1513
	    frg.dble = (arhs.ashsize == 64) ? 1 : 0;
1521
	    frg.dble = (arhs.ashsize == 64)? 1 : 0;
1514
	    setfregalt (aa, frg);
1522
	    setfregalt(aa, frg);
1515
	  }
1523
	  }
1516
	  else {
1524
	  else {
1517
	    setregalt (aa, 2);
1525
	    setregalt(aa, 2);
1518
	    sp = guardreg(2,sp);
1526
	    sp = guardreg(2,sp);
1519
	  }
1527
	  }
1520
	  assdest = locate (lhs, sp, sh (rhs), 0);
1528
	  assdest = locate(lhs, sp, sh(rhs), 0);
1521
	  move (aa, assdest, sp, 1);
1529
	  move(aa, assdest, sp, 1);
1522
	  clear_dep_reg (lhs);
1530
	  clear_dep_reg(lhs);
1523
	  return mka;
1531
	  return mka;
1524
	}
1532
	}
1525
 
1533
 
1526
 
1534
 
1527
	assdest = locate (lhs, sp, sh (rhs), 0);
1535
	assdest = locate(lhs, sp, sh(rhs), 0);
1528
	nsp = guard (assdest, sp);
1536
	nsp = guard(assdest, sp);
1529
	/* evaluate 'address' of destination */
1537
	/* evaluate 'address' of destination */
1530
 
1538
 
1531
	if (name (e) == ass_tag
1539
	if (name(e) == ass_tag
1532
	      && assdest.answhere.discrim == notinreg) {
1540
	      && assdest.answhere.discrim == notinreg) {
1533
	    instore is;
1541
	    instore is;
1534
	    is = insalt (assdest.answhere);
1542
	    is = insalt(assdest.answhere);
1535
	    if (!is.adval) {	/* this is an indirect assignment, so make
1543
	    if (!is.adval) {	/* this is an indirect assignment, so make
1536
				   it direct by loading pointer into reg
1544
				   it direct by loading pointer into reg
1537
				   (and remember it) */
1545
				   (and remember it) */
1538
	      int   r = getreg (sp.fixed);
1546
	      int   r = getreg(sp.fixed);
1539
	      ls_ins (i_lw, r, is.b);
1547
	      ls_ins(i_lw, r, is.b);
1540
	      nsp = guardreg (r, sp);
1548
	      nsp = guardreg(r, sp);
1541
	      is.adval = 1;
1549
	      is.adval = 1;
1542
	      is.b.base = r;
1550
	      is.b.base = r;
1543
	      is.b.offset = 0;
1551
	      is.b.offset = 0;
1544
	      setinsalt (assdest.answhere, is);
1552
	      setinsalt(assdest.answhere, is);
1545
	      keepexp (lhs, assdest.answhere);
1553
	      keepexp(lhs, assdest.answhere);
1546
	    }
1554
	    }
1547
	  }
1555
	  }
1548
 
1556
 
1549
 
1557
 
1550
	contreg = code_here (rhs, nsp, assdest);
1558
	contreg = code_here(rhs, nsp, assdest);
1551
	/* evaluate source into assignment destination .... */
1559
	/* evaluate source into assignment destination .... */
1552
 
1560
 
1553
 
1561
 
1554
 
1562
 
1555
	switch (assdest.answhere.discrim) {
1563
	switch (assdest.answhere.discrim) {
1556
	  case inreg:
1564
	  case inreg:
1557
	    {
1565
	    {
1558
	      int   a = regalt (assdest.answhere);
1566
	      int   a = regalt(assdest.answhere);
1559
	      keepreg (rhs, a);
1567
	      keepreg(rhs, a);
1560
	      /* remember that source has been evaluated into a */
1568
	      /* remember that source has been evaluated into a */
1561
	      clear_dep_reg (lhs);
1569
	      clear_dep_reg(lhs);
1562
	      /* forget register dependencies on destination */
1570
	      /* forget register dependencies on destination */
1563
	      break;
1571
	      break;
1564
	    }
1572
	    }
1565
	  case infreg:
1573
	  case infreg:
1566
	    {
1574
	    {
1567
	      freg frg;
1575
	      freg frg;
1568
	      int   r;
1576
	      int   r;
1569
	      frg = fregalt (assdest.answhere);
1577
	      frg = fregalt(assdest.answhere);
1570
	      r = frg.fr + 32;
1578
	      r = frg.fr + 32;
1571
	      if (frg.dble) {
1579
	      if (frg.dble) {
1572
		r = -r;
1580
		r = -r;
1573
	      };
1581
	      };
1574
	      keepreg (rhs, r);
1582
	      keepreg(rhs, r);
1575
	      /* remember that source has been evaluated into a */
1583
	      /* remember that source has been evaluated into a */
1576
	      clear_dep_reg (lhs);
1584
	      clear_dep_reg(lhs);
1577
	      /* forget register dependencies on destination */
1585
	      /* forget register dependencies on destination */
1578
	      break;
1586
	      break;
1579
	    }
1587
	    }
1580
 
1588
 
1581
	  case notinreg:
1589
	  case notinreg:
1582
	    {
1590
	    {
1583
	      if (contreg != NOREG && name (e) == ass_tag) {
1591
	      if (contreg != NOREG && name(e) == ass_tag) {
1584
		clear_dep_reg (lhs);
1592
		clear_dep_reg(lhs);
1585
		/* forget register dependencies on destination */
1593
		/* forget register dependencies on destination */
1586
 
1594
 
1587
		if (name(lhs) == name_tag) {
1595
		if (name(lhs) == name_tag) {
1588
			exp dc = son(lhs);
1596
			exp dc = son(lhs);
1589
			exp u = pt(dc);
1597
			exp u = pt(dc);
1590
			while (u != nilexp) {
1598
			while (u != nilexp) {
1591
				/* loook through uses to find cont(name) */
1599
				/* loook through uses to find cont(name) */
1592
			   if ( last(u) && no(u)==no(lhs) && bro(u)!=nilexp &&
1600
			   if (last(u) && no(u) ==no(lhs) && bro(u)!=nilexp &&
1593
				name(bro(u))==cont_tag &&
1601
				name(bro(u)) ==cont_tag &&
1594
				shape_size(sh(bro(u))) == shape_size(sh(rhs)) ) {
1602
				shape_size(sh(bro(u))) == shape_size(sh(rhs))) {
1595
				keepreg (bro(u), contreg);
1603
				keepreg(bro(u), contreg);
1596
				break;
1604
				break;
1597
			   }
1605
			   }
1598
			   u = pt(u);
1606
			   u = pt(u);
1599
			}
1607
			}
1600
			/* remember cont of name as in contreg */
1608
			/* remember cont of name as in contreg */
1601
 
1609
 
1602
		}
1610
		}
1603
		else
1611
		else
1604
		if (!dependson (lhs, 0, lhs) ){
1612
		if (!dependson(lhs, 0, lhs)) {
1605
		  /* remember that dest contains source, provided that it
1613
		  /* remember that dest contains source, provided that it
1606
		     is not dependent on it */
1614
		     is not dependent on it */
1607
		  keepcont (lhs, contreg);
1615
		  keepcont(lhs, contreg);
1608
		}
1616
		}
1609
		return mka;
1617
		return mka;
1610
	      }
1618
	      }
1611
	      clear_dep_reg (lhs);
1619
	      clear_dep_reg(lhs);
1612
	      /* forget register dependencies on destination */
1620
	      /* forget register dependencies on destination */
1613
	      break;
1621
	      break;
1614
	    }
1622
	    }
1615
	  case insomereg: case insomefreg:
1623
	  case insomereg: case insomefreg:
1616
	      {
1624
	      {
1617
		clear_dep_reg (lhs);
1625
		clear_dep_reg(lhs);
1618
		/* forget register dependencies on destination */
1626
		/* forget register dependencies on destination */
1619
 
1627
 
1620
	      }
1628
	      }
1621
	}			/* end sw on answhere */
1629
	}			/* end sw on answhere */
1622
 
1630
 
1623
	if (name (e) == assvol_tag)
1631
	if (name(e) == assvol_tag)
1624
	  setnovolatile ();
1632
	  setnovolatile();
1625
	return mka;
1633
	return mka;
1626
      }				/* end ass */
1634
      }				/* end ass */
1627
 
1635
 
1628
    case compound_tag:
1636
    case compound_tag:
1629
      {
1637
      {
1630
	exp t = son (e);
1638
	exp t = son(e);
1631
	space nsp;
1639
	space nsp;
1632
	instore str;
1640
	instore str;
1633
	int r;
1641
	int r;
1634
 
1642
 
1635
	nsp = sp;
1643
	nsp = sp;
1636
	switch(dest.answhere.discrim) {
1644
	switch (dest.answhere.discrim) {
1637
	   case notinreg: {
1645
	   case notinreg: {
1638
            str = insalt (dest.answhere);/* it should be !! */
1646
            str = insalt (dest.answhere);/* it should be !! */
1639
            if (!str.adval) {
1647
            if (!str.adval) {
1640
              int   r = getreg (sp.fixed);
1648
              int   r = getreg(sp.fixed);
1641
              nsp = guardreg (r, sp);
1649
              nsp = guardreg(r, sp);
1642
              ls_ins (i_lw, r, str.b);
1650
              ls_ins(i_lw, r, str.b);
1643
              str.adval = 1;
1651
              str.adval = 1;
1644
              str.b.base = r;
1652
              str.b.base = r;
1645
              str.b.offset = 0;
1653
              str.b.offset = 0;
1646
            }
1654
            }
1647
            for (;;) {
1655
            for (;;) {
1648
              where newdest;
1656
              where newdest;
1649
              instore newis;
1657
              instore newis;
1650
              newis = str;
1658
              newis = str;
1651
              newis.b.offset += no(t);
1659
              newis.b.offset += no(t);
1652
 
1660
 
1653
              Assert(name(t)==val_tag && al2(sh(t)) >= 8);
1661
              Assert(name(t) ==val_tag && al2(sh(t)) >= 8);
1654
 
1662
 
1655
 
1663
 
1656
              setinsalt (newdest.answhere, newis);
1664
              setinsalt(newdest.answhere, newis);
1657
              newdest.ashwhere = ashof (sh(bro(t)));
1665
              newdest.ashwhere = ashof(sh(bro(t)));
1658
              code_here (bro(t), nsp, newdest);
1666
              code_here(bro(t), nsp, newdest);
1659
              if (last (bro(t))) {
1667
              if (last(bro(t))) {
1660
                return mka;
1668
                return mka;
1661
              }
1669
              }
1662
              t = bro (bro(t));
1670
              t = bro(bro(t));
1663
            }
1671
            }
1664
          }
1672
          }
1665
          case insomereg: {
1673
          case insomereg: {
1666
            int * sr = someregalt(dest.answhere);
1674
            int * sr = someregalt(dest.answhere);
1667
            if (*sr != -1) {
1675
            if (*sr != -1) {
1668
              failer ("Somereg *2");
1676
              failer("Somereg *2");
1669
            }
1677
            }
1670
            *sr = getreg (sp.fixed);
1678
            *sr = getreg(sp.fixed);
1671
            setregalt (dest.answhere, *sr);
1679
            setregalt(dest.answhere, *sr);
1672
 	    /* ,... */
1680
 	    /* ,... */
1673
          }
1681
          }
1674
          case inreg: {
1682
          case inreg: {
1675
            code_here(bro(t), sp, dest);
1683
            code_here(bro(t), sp, dest);
1676
            r = regalt(dest.answhere);
1684
            r = regalt(dest.answhere);
1677
            Assert(name(t)==val_tag);
1685
            Assert(name(t) ==val_tag);
1678
            if (no(t) !=0) {
1686
            if (no(t)!=0) {
1679
            	rri_ins(i_sll, r, r, (al2(sh(t)) >= 8)? (no(t)<<3):no(t));
1687
            	rri_ins(i_sll, r, r,(al2(sh(t)) >= 8)?(no(t) <<3):no(t));
1680
            }
1688
            }
1681
            nsp = guardreg(r, sp);
1689
            nsp = guardreg(r, sp);
1682
            while(!last(bro(t))) {
1690
            while (!last(bro(t))) {
1683
            	int z;
1691
            	int z;
1684
            	t = bro(bro(t));
1692
            	t = bro(bro(t));
1685
            	Assert(name(t)==val_tag);
1693
            	Assert(name(t) ==val_tag);
1686
            	z = reg_operand(bro(t), nsp);
1694
            	z = reg_operand(bro(t), nsp);
1687
            	if (no(t) !=0) {
1695
            	if (no(t)!=0) {
1688
            		rri_ins(i_sll, z,z, (al2(sh(t)) >= 8)? (no(t)<<3):no(t) );
1696
            		rri_ins(i_sll, z,z,(al2(sh(t)) >= 8)?(no(t) <<3):no(t));
1689
                }
1697
                }
1690
                rrr_ins(i_or, r, r, z);
1698
                rrr_ins(i_or, r, r, z);
1691
            }
1699
            }
1692
            return mka;
1700
            return mka;
1693
          }
1701
          }
1694
          case insomefreg: {
1702
          case insomefreg: {
1695
	       somefreg sfr;
1703
	       somefreg sfr;
1696
	       freg fr;
1704
	       freg fr;
1697
   	       sfr = somefregalt(dest.answhere);
1705
   	       sfr = somefregalt(dest.answhere);
1698
	       if (*sfr.fr != -1) { failer ("Somefreg *2"); }
1706
	       if (*sfr.fr != -1) { failer("Somefreg *2"); }
1699
	       *sfr.fr = getfreg(sp.flt);
1707
	       *sfr.fr = getfreg(sp.flt);
1700
	       fr.fr = *sfr.fr;
1708
	       fr.fr = *sfr.fr;
1701
	       fr.dble = sfr.dble;
1709
	       fr.dble = sfr.dble;
1702
	       setfregalt(dest.answhere, fr);
1710
	       setfregalt(dest.answhere, fr);
1703
          }
1711
          }
1704
	  case infreg:{
1712
	  case infreg:{
1705
	    code_here(bro(t), sp, dest);
1713
	    code_here(bro(t), sp, dest);
1706
	    if (!last(bro(t)) || name(t)!=val_tag || no(t) !=0) {
1714
	    if (!last(bro(t)) || name(t)!=val_tag || no(t)!=0) {
1707
	       failer("No Tuples in freg");
1715
	       failer("No Tuples in freg");
1708
	    }
1716
	    }
1709
	    return mka;
1717
	    return mka;
1710
	  }
1718
	  }
1711
        }
1719
        }
1712
 
1720
 
1713
      }				/* end tup */
1721
      }				/* end tup */
1714
 
1722
 
1715
    case nof_tag: case concatnof_tag:
1723
    case nof_tag: case concatnof_tag:
1716
   {
1724
   {
1717
	exp t = son (e);
1725
	exp t = son(e);
1718
	space nsp;
1726
	space nsp;
1719
	instore str;
1727
	instore str;
1720
	int r, disp = 0;
1728
	int r, disp = 0;
1721
 
1729
 
1722
	if (t == nilexp) return mka;
1730
	if (t == nilexp) return mka;
1723
 
1731
 
1724
	nsp = sp;
1732
	nsp = sp;
1725
	switch(dest.answhere.discrim) {
1733
	switch (dest.answhere.discrim) {
1726
	   case notinreg: {
1734
	   case notinreg: {
1727
            str = insalt (dest.answhere);/* it should be !! */
1735
            str = insalt (dest.answhere);/* it should be !! */
1728
            if (!str.adval) {
1736
            if (!str.adval) {
1729
              int   r = getreg (sp.fixed);
1737
              int   r = getreg(sp.fixed);
1730
              nsp = guardreg (r, sp);
1738
              nsp = guardreg(r, sp);
1731
              ls_ins (i_lw, r, str.b);
1739
              ls_ins(i_lw, r, str.b);
1732
              str.adval = 1;
1740
              str.adval = 1;
1733
              str.b.base = r;
1741
              str.b.base = r;
1734
              str.b.offset = 0;
1742
              str.b.offset = 0;
1735
            }
1743
            }
1736
            for (;;) {
1744
            for (;;) {
1737
              where newdest;
1745
              where newdest;
1738
              instore newis;
1746
              instore newis;
1739
              newis = str;
1747
              newis = str;
1740
              newis.b.offset += disp;
1748
              newis.b.offset += disp;
1741
              setinsalt (newdest.answhere, newis);
1749
              setinsalt(newdest.answhere, newis);
1742
              newdest.ashwhere = ashof (sh(t));
1750
              newdest.ashwhere = ashof(sh(t));
1743
              code_here (t, nsp, newdest);
1751
              code_here(t, nsp, newdest);
1744
              if (last (t)) {
1752
              if (last(t)) {
1745
                return mka;
1753
                return mka;
1746
              }
1754
              }
1747
              disp+=(rounder(shape_size(sh(t)), shape_align(sh(bro(t))))>>3);
1755
              disp+= (rounder(shape_size(sh(t)), shape_align(sh(bro(t)))) >>3);
1748
              t =bro(t);
1756
              t =bro(t);
1749
            }
1757
            }
1750
          }
1758
          }
1751
          case insomereg: {
1759
          case insomereg: {
1752
            int * sr = someregalt(dest.answhere);
1760
            int * sr = someregalt(dest.answhere);
1753
            if (*sr != -1) {
1761
            if (*sr != -1) {
1754
              failer ("Somereg *2");
1762
              failer("Somereg *2");
1755
            }
1763
            }
1756
            *sr = getreg (sp.fixed);
1764
            *sr = getreg(sp.fixed);
1757
            setregalt (dest.answhere, *sr);
1765
            setregalt(dest.answhere, *sr);
1758
 	    /* ,... */
1766
 	    /* ,... */
1759
          }
1767
          }
1760
          case inreg: {
1768
          case inreg: {
1761
            code_here(t, sp, dest);
1769
            code_here(t, sp, dest);
1762
            r = regalt(dest.answhere);
1770
            r = regalt(dest.answhere);
1763
            nsp = guardreg(r, sp);
1771
            nsp = guardreg(r, sp);
1764
            while(!last(t)) {
1772
            while (!last(t)) {
1765
            	int z;
1773
            	int z;
1766
            	disp+=rounder(shape_size(sh(t)), shape_align(sh(bro(t))));
1774
            	disp+=rounder(shape_size(sh(t)), shape_align(sh(bro(t))));
1767
            	t =bro(t);
1775
            	t =bro(t);
1768
            	z = reg_operand(t, nsp);
1776
            	z = reg_operand(t, nsp);
1769
            	rri_ins(i_sll, z,z, disp );
1777
            	rri_ins(i_sll, z,z, disp);
1770
                rrr_ins(i_or, r, r, z);
1778
                rrr_ins(i_or, r, r, z);
1771
            }
1779
            }
1772
            return mka;
1780
            return mka;
1773
          }
1781
          }
1774
	  default: failer("No Tuples in freg");
1782
	  default: failer("No Tuples in freg");
1775
        }
1783
        }
1776
 
1784
 
1777
      }
1785
      }
1778
 
1786
 
1779
      case ncopies_tag:
1787
      case ncopies_tag:
1780
   {
1788
   {
1781
	exp t = son (e);
1789
	exp t = son(e);
1782
	space nsp;
1790
	space nsp;
1783
	instore str;
1791
	instore str;
1784
	int i, r, disp = 0;
1792
	int i, r, disp = 0;
1785
 
1793
 
1786
	nsp = sp;
1794
	nsp = sp;
1787
	switch(dest.answhere.discrim) {
1795
	switch (dest.answhere.discrim) {
1788
	   case notinreg: {
1796
	   case notinreg: {
1789
            str = insalt (dest.answhere);/* it should be !! */
1797
            str = insalt (dest.answhere);/* it should be !! */
1790
            if (!str.adval) {
1798
            if (!str.adval) {
1791
              int   r = getreg (sp.fixed);
1799
              int   r = getreg(sp.fixed);
1792
              nsp = guardreg (r, sp);
1800
              nsp = guardreg(r, sp);
1793
              ls_ins (i_lw, r, str.b);
1801
              ls_ins(i_lw, r, str.b);
1794
              str.adval = 1;
1802
              str.adval = 1;
1795
              str.b.base = r;
1803
              str.b.base = r;
1796
              str.b.offset = 0;
1804
              str.b.offset = 0;
1797
            }
1805
            }
1798
            for (i=1;i<=no(e); i++) {
1806
            for (i=1;i<=no(e); i++) {
1799
              where newdest;
1807
              where newdest;
1800
              instore newis;
1808
              instore newis;
1801
              newis = str;
1809
              newis = str;
1802
              newis.b.offset += disp;
1810
              newis.b.offset += disp;
1803
              setinsalt (newdest.answhere, newis);
1811
              setinsalt(newdest.answhere, newis);
1804
              newdest.ashwhere = ashof (sh(t));
1812
              newdest.ashwhere = ashof(sh(t));
1805
              code_here (t, nsp, newdest);
1813
              code_here(t, nsp, newdest);
1806
              disp+=(rounder(shape_size(sh(t)), shape_align(sh(t)))>>3);
1814
              disp+= (rounder(shape_size(sh(t)), shape_align(sh(t))) >>3);
1807
            }
1815
            }
1808
            return mka;
1816
            return mka;
1809
          }
1817
          }
1810
          case insomereg: {
1818
          case insomereg: {
1811
            int * sr = someregalt(dest.answhere);
1819
            int * sr = someregalt(dest.answhere);
1812
            if (*sr != -1) {
1820
            if (*sr != -1) {
1813
              failer ("Somereg *2");
1821
              failer("Somereg *2");
1814
            }
1822
            }
1815
            *sr = getreg (sp.fixed);
1823
            *sr = getreg(sp.fixed);
1816
            setregalt (dest.answhere, *sr);
1824
            setregalt(dest.answhere, *sr);
1817
 	    /* ,... */
1825
 	    /* ,... */
1818
          }
1826
          }
1819
          case inreg: {
1827
          case inreg: {
1820
            code_here(t, sp, dest);
1828
            code_here(t, sp, dest);
1821
            r = regalt(dest.answhere);
1829
            r = regalt(dest.answhere);
1822
            nsp = guardreg(r, sp);
1830
            nsp = guardreg(r, sp);
1823
            for(i=1; i<=no(e); i++) {
1831
            for (i=1; i<=no(e); i++) {
1824
            	int z;
1832
            	int z;
1825
            	disp+=rounder(shape_size(sh(t)), shape_align(sh(t)));
1833
            	disp+=rounder(shape_size(sh(t)), shape_align(sh(t)));
1826
            	z = reg_operand(t, nsp);
1834
            	z = reg_operand(t, nsp);
1827
            	rri_ins(i_sll, z,z, disp );
1835
            	rri_ins(i_sll, z,z, disp);
1828
                rrr_ins(i_or, r, r, z);
1836
                rrr_ins(i_or, r, r, z);
1829
            }
1837
            }
1830
            return mka;
1838
            return mka;
1831
          }
1839
          }
1832
	  default: failer("No Tuples in freg");
1840
	  default: failer("No Tuples in freg");
Line 1846... Line 1854...
1846
    	  exp cers = bro(fn);
1854
    	  exp cers = bro(fn);
1847
    	  exp cees = bro(cers);
1855
    	  exp cees = bro(cers);
1848
    	  exp pl = bro(cees);
1856
    	  exp pl = bro(cees);
1849
    	  space nsp;
1857
    	  space nsp;
1850
 
1858
 
1851
    	  if (no(cers) !=0) { nsp = do_callers(son(cers),sp); }
1859
    	  if (no(cers)!=0) { nsp = do_callers(son(cers),sp); }
1852
	  else { nsp = sp; }
1860
	  else { nsp = sp; }
1853
 
1861
 
1854
    	  IGNORE make_code(cees, nsp, nowhere, 0);
1862
    	  IGNORE make_code(cees, nsp, nowhere, 0);
1855
 
1863
 
1856
    	  if (name (fn) == name_tag && name (son (fn)) == ident_tag
1864
    	  if (name(fn) == name_tag && name(son(fn)) == ident_tag
1857
	    && (son (son (fn)) == nilexp ||
1865
	    && (son(son(fn)) == nilexp ||
1858
	        name (son (son (fn))) == proc_tag ||
1866
	        name(son(son(fn))) == proc_tag ||
1859
	     name (son (son (fn))) == general_proc_tag)) {
1867
	     name(son(son(fn))) == general_proc_tag)) {
1860
	  /* the procedure can be entered directly */
1868
	  /* the procedure can be entered directly */
1861
	  	extj_ins (i_jal, boff (son (fn)));
1869
	  	extj_ins(i_jal, boff(son(fn)));
1862
	  }
1870
	  }
1863
	  else
1871
	  else
1864
	  if (PIC_code) {
1872
	  if (PIC_code) {
1865
		/* have to get address of proc into r25 */
1873
		/* have to get address of proc into r25 */
1866
		where w;
1874
		where w;
Line 1870... Line 1878...
1870
		br_ins(i_jal, 25);
1878
		br_ins(i_jal, 25);
1871
          }
1879
          }
1872
    	  else {			/* the address of the proc is evaluated
1880
    	  else {			/* the address of the proc is evaluated
1873
				   and entered indirectly */
1881
				   and entered indirectly */
1874
	  clear_reg(31); /* can't use 31 as temp reg for jal */
1882
	  clear_reg(31); /* can't use 31 as temp reg for jal */
1875
	  br_ins (i_jal, reg_operand (fn, guardreg(31,sp)));
1883
	  br_ins(i_jal, reg_operand(fn, guardreg(31,sp)));
1876
	}
1884
	}
1877
	if (PIC_code) reset_gp();
1885
	if (PIC_code)reset_gp();
1878
	clear_all ();		/* forget all register memories */
1886
	clear_all ();		/* forget all register memories */
1879
        { int hda = name(sh(e));
1887
        { int hda = name(sh(e));
1880
	  ans aa;
1888
	  ans aa;
1881
	  if (is_floating (hda)) {
1889
	  if (is_floating(hda)) {
1882
	    freg frg;
1890
	    freg frg;
1883
	    frg.fr = 0;
1891
	    frg.fr = 0;
1884
	    frg.dble = (hda != shrealhd);
1892
	    frg.dble = (hda != shrealhd);
1885
	    setfregalt (aa, frg);
1893
	    setfregalt(aa, frg);
1886
	    move (aa, dest, sp, 1);
1894
	    move(aa, dest, sp, 1);
1887
	    /* move floating point result of application to destination */
1895
	    /* move floating point result of application to destination */
1888
	  }
1896
	  }
1889
	  else {
1897
	  else {
1890
	    setregalt (aa, 2);
1898
	    setregalt(aa, 2);
1891
	    mka.regmove = 2;
1899
	    mka.regmove = 2;
1892
	    move (aa, dest, sp, 1);
1900
	    move(aa, dest, sp, 1);
1893
	    /* move floating point result of application to destination */
1901
	    /* move floating point result of application to destination */
1894
	  }
1902
	  }
1895
	  /* else struct results are moved by body of proc */
1903
	  /* else struct results are moved by body of proc */
1896
	}
1904
	}
1897
 
1905
 
1898
	if (call_is_untidy(cees)) {
1906
	if (call_is_untidy(cees)) {
1899
		rri_ins(i_subu, 29, 29, max_args>>3);
1907
		rri_ins(i_subu, 29, 29, max_args>>3);
1900
		reset_tos();
1908
		reset_tos();
1901
		Assert(name(pl)==top_tag);
1909
		Assert(name(pl) ==top_tag);
1902
	}
1910
	}
1903
	else
1911
	else
1904
	if(postlude_has_call(e)) {
1912
	if (postlude_has_call(e)) {
1905
		exp x = son(cers);
1913
		exp x = son(cers);
1906
		postl_chain p;
1914
		postl_chain p;
1907
		for(;x != nilexp ;) {
1915
		for (;x != nilexp ;) {
1908
			if (name(x)==caller_tag) {
1916
			if (name(x) ==caller_tag) {
1909
				no(x) += max_args;
1917
				no(x) += max_args;
1910
			}
1918
			}
1911
			if (last(x)) break;
1919
			if (last(x))break;
1912
			x = bro(x);
1920
			x = bro(x);
1913
		}
1921
		}
1914
		mka.regmove = NOREG;
1922
		mka.regmove = NOREG;
1915
		update_plc(old_pls, max_args);
1923
		update_plc(old_pls, max_args);
1916
		p.pl = pl;
1924
		p.pl = pl;
Line 1932... Line 1940...
1932
    	return mka;
1940
    	return mka;
1933
    }
1941
    }
1934
 
1942
 
1935
    case make_callee_list_tag: {
1943
    case make_callee_list_tag: {
1936
 
1944
 
1937
    	long x = ((no(e)>>3)+23) & ~7;
1945
    	long x = ((no(e) >>3) +23) & ~7;
1938
	do_callee_list(e, sp);
1946
	do_callee_list(e, sp);
1939
    	if (call_has_vcallees(e)) { rri_ins(i_addu, 30, 29, x);}
1947
    	if (call_has_vcallees(e)) { rri_ins(i_addu, 30, 29, x);}
1940
    	return mka;
1948
    	return mka;
1941
/*
1949
/*
1942
	| 1st callee par	|	= sf on entry
1950
	| 1st callee par	|	= sf on entry
Line 1956... Line 1964...
1956
        baseoff b;
1964
        baseoff b;
1957
        bool vc = call_has_vcallees(e);
1965
        bool vc = call_has_vcallees(e);
1958
        space nsp;
1966
        space nsp;
1959
	exp bdy = son(crt_proc);
1967
	exp bdy = son(crt_proc);
1960
 
1968
 
1961
	while(name(bdy)==dump_tag || name(bdy)==diagnose_tag) bdy = son(bdy);
1969
	while (name(bdy) ==dump_tag || name(bdy) ==diagnose_tag)bdy = son(bdy);
1962
	while (name(bdy)==ident_tag && isparam(bdy)) {
1970
	while (name(bdy) ==ident_tag && isparam(bdy)) {
1963
		/* make sure that current callees are in right place */
1971
		/* make sure that current callees are in right place */
1964
	   exp sbdy = son(bdy);
1972
	   exp sbdy = son(bdy);
1965
	   if (name(sbdy)==formal_callee_tag &&(props(bdy) &inanyreg)!=0
1973
	   if (name(sbdy) ==formal_callee_tag && (props(bdy) &inanyreg)!=0
1966
			&& isvar(bdy) ) {
1974
			&& isvar(bdy)) {
1967
		baseoff b;
1975
		baseoff b;
1968
		if (Has_fp) {
1976
		if (Has_fp) {
1969
			b.base = 30;
1977
			b.base = 30;
1970
			b.offset = (no(sbdy)-callee_size)>>3;
1978
			b.offset = (no(sbdy) -callee_size) >>3;
1971
		}
1979
		}
1972
		else {
1980
		else {
1973
			b.base = 29;
1981
			b.base = 29;
1974
			b.offset = (no(sbdy)+frame_size)>>3;
1982
			b.offset = (no(sbdy) +frame_size) >>3;
1975
		}
1983
		}
1976
		if(is_floating(name(sh(sbdy)))) {
1984
		if (is_floating(name(sh(sbdy)))) {
1977
			lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
1985
			lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
1978
					  no(bdy)<<1, b);
1986
					  no(bdy) <<1, b);
1979
		}
1987
		}
1980
		else ls_ins(i_sw, no(bdy), b);
1988
		else ls_ins(i_sw, no(bdy), b);
1981
	    }
1989
	    }
1982
	    bdy = bro(sbdy);
1990
	    bdy = bro(sbdy);
1983
	}
1991
	}
Line 2019... Line 2027...
2019
    		int i;
2027
    		int i;
2020
    		int tr = getreg(sp.fixed);
2028
    		int tr = getreg(sp.fixed);
2021
    		rri_ins(i_subu, 29,29, cs);
2029
    		rri_ins(i_subu, 29,29, cs);
2022
    		b.base = 29; b.offset = cs-4;
2030
    		b.base = 29; b.offset = cs-4;
2023
    		ls_ins(i_sw, 30, b);
2031
    		ls_ins(i_sw, 30, b);
2024
    		for(i = cs-16; i>0; i-=4) {
2032
    		for (i = cs-16; i>0; i-=4) {
2025
    		        b.base = 30; b.offset = i-cs-4;
2033
    		        b.base = 30; b.offset = i-cs-4;
2026
    			ls_ins(i_lw, tr, b);
2034
    			ls_ins(i_lw, tr, b);
2027
    			b.base = 29; b.offset = i-4;
2035
    			b.base = 29; b.offset = i-4;
2028
    			ls_ins(i_sw, tr, b);
2036
    			ls_ins(i_sw, tr, b);
2029
    		}
2037
    		}
Line 2054... Line 2062...
2054
	tempreg = getreg(nsp.fixed);
2062
	tempreg = getreg(nsp.fixed);
2055
	rri_ins(i_addu, rdest, rsize, 7+16);
2063
	rri_ins(i_addu, rdest, rsize, 7+16);
2056
	rri_ins(i_and, rdest,rdest, ~7);
2064
	rri_ins(i_and, rdest,rdest, ~7);
2057
	b.base= 29; b.offset = -4;
2065
	b.base= 29; b.offset = -4;
2058
	ls_ins(i_sw, 30, b);
2066
	ls_ins(i_sw, 30, b);
2059
	if (vc) mon_ins(i_move, 30, 29);
2067
	if (vc)mon_ins(i_move, 30, 29);
2060
	rrr_ins(i_subu, 29, 29, rdest);
2068
	rrr_ins(i_subu, 29, 29, rdest);
2061
	rri_ins(i_addu, rdest, 29, 0);
2069
	rri_ins(i_addu, rdest, 29, 0);
2062
	ls = new_label();
2070
	ls = new_label();
2063
	le = new_label();
2071
	le = new_label();
2064
	condrr_ins(i_ble, rsize, 0, le);
2072
	condrr_ins(i_ble, rsize, 0, le);
Line 2078... Line 2086...
2078
    }
2086
    }
2079
 
2087
 
2080
    case tail_call_tag: {
2088
    case tail_call_tag: {
2081
    	exp fn = son(e);
2089
    	exp fn = son(e);
2082
    	exp cees = bro(fn);
2090
    	exp cees = bro(fn);
2083
    	bool glob = (name (fn) == name_tag && name (son (fn)) == ident_tag
2091
    	bool glob = (name(fn) == name_tag && name(son(fn)) == ident_tag
2084
	    		&& (son (son (fn)) == nilexp ||
2092
	    		&& (son(son(fn)) == nilexp ||
2085
	        		name (son (son (fn))) == proc_tag ||
2093
	        		name(son(son(fn))) == proc_tag ||
2086
	     			name (son (son (fn))) ==
2094
	     			name(son(son(fn))) ==
2087
	     			general_proc_tag));
2095
	     			general_proc_tag));
2088
	exp bdy = son(crt_proc);
2096
	exp bdy = son(crt_proc);
2089
	int rptr; int rsz;
2097
	int rptr; int rsz;
2090
	space nsp;
2098
	space nsp;
2091
	space xsp;
2099
	space xsp;
2092
	int temp_fn_reg;
2100
	int temp_fn_reg;
2093
 
2101
 
2094
	nsp=sp;
2102
	nsp=sp;
2095
	xsp=sp;
2103
	xsp=sp;
2096
    	if (name(cees)==make_callee_list_tag) {
2104
    	if (name(cees) ==make_callee_list_tag) {
2097
    		do_callee_list(cees, sp);
2105
    		do_callee_list(cees, sp);
2098
    	}
2106
    	}
2099
 
2107
 
2100
	xsp.fixed = 0x800000f0;
2108
	xsp.fixed = 0x800000f0;
2101
	nsp.fixed |= 0x800000f0; /* don't use parregs or linkreg */
2109
	nsp.fixed |= 0x800000f0; /* don't use parregs or linkreg */
2102
    	if (name(cees)==make_dynamic_callee_tag) {
2110
    	if (name(cees) ==make_dynamic_callee_tag) {
2103
    		rptr = getreg(nsp.fixed);
2111
    		rptr = getreg(nsp.fixed);
2104
    		load_reg(son(cees),rptr,nsp);
2112
    		load_reg(son(cees),rptr,nsp);
2105
    		nsp = guardreg(rptr, nsp);
2113
    		nsp = guardreg(rptr, nsp);
2106
		xsp = guardreg(rptr, xsp);
2114
		xsp = guardreg(rptr, xsp);
2107
    		rsz = getreg(nsp.fixed);
2115
    		rsz = getreg(nsp.fixed);
Line 2112... Line 2120...
2112
    	if (PIC_code) {
2120
    	if (PIC_code) {
2113
		temp_fn_reg = 25;
2121
		temp_fn_reg = 25;
2114
		load_reg(fn,temp_fn_reg,nsp);
2122
		load_reg(fn,temp_fn_reg,nsp);
2115
	}
2123
	}
2116
	else
2124
	else
2117
    	if(!glob) {
2125
    	if (!glob) {
2118
    		temp_fn_reg = getreg(nsp.fixed);
2126
    		temp_fn_reg = getreg(nsp.fixed);
2119
    		load_reg(fn,temp_fn_reg,nsp);
2127
    		load_reg(fn,temp_fn_reg,nsp);
2120
		nsp = guardreg(temp_fn_reg,nsp);
2128
		nsp = guardreg(temp_fn_reg,nsp);
2121
		xsp = guardreg(temp_fn_reg,xsp);
2129
		xsp = guardreg(temp_fn_reg,xsp);
2122
    	}
2130
    	}
2123
 
2131
 
2124
 
2132
 
2125
	while(name(bdy)==dump_tag || name(bdy)==diagnose_tag) bdy = son(bdy);
2133
	while (name(bdy) ==dump_tag || name(bdy) ==diagnose_tag)bdy = son(bdy);
2126
 
2134
 
2127
	while (name(bdy)==ident_tag && isparam(bdy)) {
2135
	while (name(bdy) ==ident_tag && isparam(bdy)) {
2128
		/* make sure that current callers and callees are in right place */
2136
		/* make sure that current callers and callees are in right place */
2129
		exp sbdy = son(bdy);
2137
		exp sbdy = son(bdy);
2130
		baseoff b;
2138
		baseoff b;
2131
		if (Has_fp) {
2139
		if (Has_fp) {
2132
			b.base = 30;
2140
			b.base = 30;
2133
			b.offset = no(sbdy)>>3;
2141
			b.offset = no(sbdy) >>3;
2134
		}
2142
		}
2135
		else {
2143
		else {
2136
			b.base = 29;
2144
			b.base = 29;
2137
			b.offset = (no(sbdy)+frame_size+callee_size)>>3;
2145
			b.offset = (no(sbdy) +frame_size+callee_size) >>3;
2138
		}
2146
		}
2139
		if (name(sbdy)==formal_callee_tag
2147
		if (name(sbdy) ==formal_callee_tag
2140
			&& name(cees)== same_callees_tag) {
2148
			&& name(cees) == same_callees_tag) {
2141
		   if ((props(bdy) &inanyreg)!=0) {
2149
		   if ((props(bdy) &inanyreg)!=0) {
2142
			b.offset -= (callee_size>>3);
2150
			b.offset -= (callee_size>>3);
2143
			if(isvar(bdy)) {
2151
			if (isvar(bdy)) {
2144
			  if(is_floating(name(sh(sbdy)))) {
2152
			  if (is_floating(name(sh(sbdy)))) {
2145
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
2153
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
2146
					  no(bdy)<<1, b);
2154
					  no(bdy) <<1, b);
2147
			  }
2155
			  }
2148
			  else ls_ins(i_sw, no(bdy), b);
2156
			  else ls_ins(i_sw, no(bdy), b);
2149
			}
2157
			}
2150
		   }
2158
		   }
2151
		}
2159
		}
2152
		else
2160
		else
2153
		if (props(sbdy) == 0 && (props(bdy) &inanyreg)!=0) {
2161
		if (props(sbdy) == 0 && (props(bdy) &inanyreg)!=0) {
2154
			/* should be instore; is in reg */
2162
			/* should be instore; is in reg */
2155
			if(isvar(bdy)) {
2163
			if (isvar(bdy)) {
2156
			  if(is_floating(name(sh(sbdy)))) {
2164
			  if (is_floating(name(sh(sbdy)))) {
2157
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
2165
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_s_d:i_s_s,
2158
					  no(bdy)<<1, b);
2166
					  no(bdy) <<1, b);
2159
			  }
2167
			  }
2160
			  else ls_ins(i_sw, no(bdy), b);
2168
			  else ls_ins(i_sw, no(bdy), b);
2161
			}
2169
			}
2162
		}
2170
		}
2163
		else
2171
		else
2164
		if (props(sbdy) !=0 && (props(bdy) & inanyreg) ==0) {
2172
		if (props(sbdy)!=0 && (props(bdy) & inanyreg) ==0) {
2165
		        /* should be in reg; is in store */
2173
		        /* should be in reg; is in store */
2166
	               if (!Has_no_vcallers && isvis(bdy) && last_param(bdy) ) {
2174
	               if (!Has_no_vcallers && isvis(bdy) && last_param(bdy)) {
2167
				int i = no(sbdy)>>5;
2175
				int i = no(sbdy) >>5;
2168
				for(; i<4; i++) {
2176
				for (; i<4; i++) {
2169
					ls_ins(i_lw, i+4, b);
2177
					ls_ins(i_lw, i+4, b);
2170
					b.offset +=4;
2178
					b.offset +=4;
2171
				}
2179
				}
2172
			}
2180
			}
2173
			else
2181
			else
2174
			if(is_floating(name(sh(sbdy)))) {
2182
			if (is_floating(name(sh(sbdy)))) {
2175
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_l_d:i_l_s,
2183
				lsfp_ins((name(sh(sbdy))!=shrealhd)?i_l_d:i_l_s,
2176
					  props(sbdy)<<1, b);
2184
					  props(sbdy) <<1, b);
2177
			}
2185
			}
2178
			else ls_ins(i_lw, props(sbdy), b);
2186
			else ls_ins(i_lw, props(sbdy), b);
2179
 
2187
 
2180
		}
2188
		}
2181
		else
2189
		else
2182
		if (props(sbdy) !=0 && props(sbdy) != no(bdy) ) {
2190
		if (props(sbdy)!=0 && props(sbdy)!= no(bdy)) {
2183
                	/* in wrong register */
2191
                	/* in wrong register */
2184
                	if(is_floating(name(sh(sbdy)))) {
2192
                	if (is_floating(name(sh(sbdy)))) {
2185
                		rrfp_ins((name(sh(sbdy))!=shrealhd)?i_mov_d:i_mov_s,
2193
                		rrfp_ins((name(sh(sbdy))!=shrealhd)?i_mov_d:i_mov_s,
2186
                		          props(sbdy)<<1, no(bdy)<<1);
2194
                		          props(sbdy) <<1, no(bdy) <<1);
2187
                        }
2195
                        }
2188
                        else mon_ins(i_move, props(sbdy), no(bdy));
2196
                        else mon_ins(i_move, props(sbdy), no(bdy));
2189
               }
2197
               }
2190
 
2198
 
2191
 
2199
 
Line 2193... Line 2201...
2193
        }
2201
        }
2194
 
2202
 
2195
        restore_sregs(fixdone, fltdone);
2203
        restore_sregs(fixdone, fltdone);
2196
 
2204
 
2197
 
2205
 
2198
       if (name(cees)==make_callee_list_tag) {
2206
       if (name(cees) ==make_callee_list_tag) {
2199
       		/* copy from top of stack */
2207
       		/* copy from top of stack */
2200
       		int x = ((no(cees)>>3)+23) & ~7;
2208
       		int x = ((no(cees) >>3) +23) & ~7;
2201
       		int r = getreg(xsp.fixed);
2209
       		int r = getreg(xsp.fixed);
2202
		int r1 = getreg(guardreg(r,xsp).fixed);
2210
		int r1 = getreg(guardreg(r,xsp).fixed);
2203
       		int i;
2211
       		int i;
2204
       		baseoff b;
2212
       		baseoff b;
2205
		int ncees = no(cees)>>3;
2213
		int ncees = no(cees) >>3;
2206
		int rnc = (ncees+7)&~7;
2214
		int rnc = (ncees+7) &~7;
2207
       		for(i= ncees; i > 0; i-=4) {
2215
       		for (i= ncees; i > 0; i-=4) {
2208
		   int x = r;
2216
		   int x = r;
2209
       		   b.base = 29; b.offset = i-4;
2217
       		   b.base = 29; b.offset = i-4;
2210
       		   ls_ins(i_lw, r, b);
2218
       		   ls_ins(i_lw, r, b);
2211
       		   b.base = 30; b.offset = i-rnc-20;
2219
       		   b.base = 30; b.offset = i-rnc-20;
2212
       		   ls_ins(i_sw, r, b);
2220
       		   ls_ins(i_sw, r, b);
Line 2222... Line 2230...
2222
 
2230
 
2223
    		rri_ins(i_subu, 29, 30, x);
2231
    		rri_ins(i_subu, 29, 30, x);
2224
 
2232
 
2225
	}
2233
	}
2226
	else
2234
	else
2227
	if (name(cees)==make_dynamic_callee_tag) {
2235
	if (name(cees) ==make_dynamic_callee_tag) {
2228
		/* rdest = fp-16;
2236
		/* rdest = fp-16;
2229
		   rsize = (rsize+23)&~7
2237
		   rsize = (rsize+23)&~7
2230
		   rsource = rptr + rsize
2238
		   rsource = rptr + rsize
2231
		   while rsize>0
2239
		   while rsize>0
2232
		      [rdest-4] = [rsource-4];
2240
		      [rdest-4] = [rsource-4];
Line 2267... Line 2275...
2267
		else
2275
		else
2268
		if (Has_fp) {
2276
		if (Has_fp) {
2269
			 rri_ins(i_subu, 29, 30, callee_size>>3);
2277
			 rri_ins(i_subu, 29, 30, callee_size>>3);
2270
		}
2278
		}
2271
		else { /* this should only occur in initialisation procs */
2279
		else { /* this should only occur in initialisation procs */
2272
			rri_ins(i_addu, 29, 29, (frame_size+callee_size)>>3);
2280
			rri_ins(i_addu, 29, 29,(frame_size+callee_size) >>3);
2273
		}
2281
		}
2274
 
2282
 
2275
	}
2283
	}
2276
 
2284
 
2277
        if (Has_vcallees) {
2285
        if (Has_vcallees) {
Line 2279... Line 2287...
2279
	  	b.base = 30;
2287
	  	b.base = 30;
2280
	  	b.offset = -16;
2288
	  	b.offset = -16;
2281
	  	ls_ins(i_lw, local_reg, b); /* old l-reg in -16(30) */
2289
	  	ls_ins(i_lw, local_reg, b); /* old l-reg in -16(30) */
2282
	}
2290
	}
2283
    	if (glob && !PIC_code) {
2291
    	if (glob && !PIC_code) {
2284
    		extj_ins(i_j, boff(son(fn)) );
2292
    		extj_ins(i_j, boff(son(fn)));
2285
    	}
2293
    	}
2286
    	else {
2294
    	else {
2287
    		br_ins(i_j, temp_fn_reg);
2295
    		br_ins(i_j, temp_fn_reg);
2288
 
2296
 
2289
    	}
2297
    	}
Line 2294... Line 2302...
2294
 
2302
 
2295
    }
2303
    }
2296
 
2304
 
2297
    case apply_tag:
2305
    case apply_tag:
2298
      {
2306
      {
2299
	exp fn = son (e);
2307
	exp fn = son(e);
2300
	exp par = bro (fn);
2308
	exp par = bro(fn);
2301
	exp list = par;
2309
	exp list = par;
2302
	exp dad = father (e);
2310
	exp dad = father(e);
2303
	bool tlrecurse = rscope_level == 0 && (name(dad)== res_tag) && props(dad);
2311
	bool tlrecurse = rscope_level == 0 && (name(dad) == res_tag) && props(dad);
2304
	int   hda = name (sh (e));
2312
	int   hda = name(sh(e));
2305
	int disp;
2313
	int disp;
2306
 
2314
 
2307
	ash ansash;
2315
	ash ansash;
2308
 
2316
 
2309
 
2317
 
2310
 
2318
 
2311
	if ((disp = specialfn (fn)) > 0) {/* eg function is strlen */
2319
	if ((disp = specialfn (fn)) > 0) {/* eg function is strlen */
2312
	  mka.lab = specialmake (disp, list, sp, dest, exitlab);
2320
	  mka.lab = specialmake(disp, list, sp, dest, exitlab);
2313
	  return mka;
2321
	  return mka;
2314
	}
2322
	}
2315
 
2323
 
2316
	ansash = ashof (sh (e));
2324
	ansash = ashof(sh(e));
2317
 
2325
 
2318
	if (!last(fn)) {
2326
	if (!last(fn)) {
2319
		sp = do_callers(list, sp);
2327
		sp = do_callers(list, sp);
2320
	}
2328
	}
2321
 
2329
 
2322
 
2330
 
2323
	if (name (fn) == name_tag && name (son (fn)) == ident_tag
2331
	if (name(fn) == name_tag && name(son(fn)) == ident_tag
2324
	    && (son (son (fn)) == nilexp || name (son (son (fn))) == proc_tag)) {
2332
	    && (son(son(fn)) == nilexp || name(son(son(fn))) == proc_tag)) {
2325
	  /* the procedure can be entered directly */
2333
	  /* the procedure can be entered directly */
2326
	  if (! tlrecurse) {
2334
	  if (! tlrecurse) {
2327
	  	extj_ins (i_jal, boff (son (fn)));
2335
	  	extj_ins(i_jal, boff(son(fn)));
2328
		if (PIC_code) reset_gp();
2336
		if (PIC_code)reset_gp();
2329
	  }
2337
	  }
2330
	  else {
2338
	  else {
2331
	  	if (Has_fp) {
2339
	  	if (Has_fp) {
2332
	  		baseoff b;
2340
	  		baseoff b;
2333
	  		b.base = 30;
2341
	  		b.base = 30;
Line 2336... Line 2344...
2336
	  		mon_ins(i_move, 29, 30);
2344
	  		mon_ins(i_move, 29, 30);
2337
	  		ls_ins(i_lw, 30, b);
2345
	  		ls_ins(i_lw, 30, b);
2338
	  	}
2346
	  	}
2339
	  	else {
2347
	  	else {
2340
	  		restore_sregs(fixdone, fltdone);
2348
	  		restore_sregs(fixdone, fltdone);
2341
	  		rri_ins(i_addu, 29, 29, (frame_size+callee_size)>>3);
2349
	  		rri_ins(i_addu, 29, 29,(frame_size+callee_size) >>3);
2342
	  	}
2350
	  	}
2343
	  	extj_ins(i_j, boff(son(fn)) );
2351
	  	extj_ins(i_j, boff(son(fn)));
2344
	  	if (as_file) fprintf(as_file," # Tail recursion\n");
2352
	  	if (as_file)fprintf(as_file," # Tail recursion\n");
2345
	  }
2353
	  }
2346
 
2354
 
2347
	}
2355
	}
2348
	else
2356
	else
2349
	if (PIC_code) {
2357
	if (PIC_code) {
Line 2356... Line 2364...
2356
		reset_gp();
2364
		reset_gp();
2357
        }
2365
        }
2358
	else {			/* the address of the proc is evaluated
2366
	else {			/* the address of the proc is evaluated
2359
				   and entered indirectly */
2367
				   and entered indirectly */
2360
	  clear_reg(31); /* can't use 31 as temp reg for jal */
2368
	  clear_reg(31); /* can't use 31 as temp reg for jal */
2361
	  br_ins (i_jal, reg_operand (fn, guardreg(31,sp)));
2369
	  br_ins(i_jal, reg_operand(fn, guardreg(31,sp)));
2362
	}
2370
	}
2363
	clear_all ();		/* forget all register memories */
2371
	clear_all ();		/* forget all register memories */
2364
        {
2372
        {
2365
	  ans aa;
2373
	  ans aa;
2366
	  if (is_floating (hda)) {
2374
	  if (is_floating(hda)) {
2367
	    freg frg;
2375
	    freg frg;
2368
	    frg.fr = 0;
2376
	    frg.fr = 0;
2369
	    frg.dble = (hda != shrealhd);
2377
	    frg.dble = (hda != shrealhd);
2370
	    setfregalt (aa, frg);
2378
	    setfregalt(aa, frg);
2371
	    move (aa, dest, sp, 1);
2379
	    move(aa, dest, sp, 1);
2372
	    /* move floating point result of application to destination */
2380
	    /* move floating point result of application to destination */
2373
	  }
2381
	  }
2374
	  else {
2382
	  else {
2375
	    setregalt (aa, 2);
2383
	    setregalt(aa, 2);
2376
	    mka.regmove = 2;
2384
	    mka.regmove = 2;
2377
	    move (aa, dest, guardreg(2,sp), 1);
2385
	    move(aa, dest, guardreg(2,sp), 1);
2378
	    /* move fixed point result of application to destination */
2386
	    /* move fixed point result of application to destination */
2379
	  }
2387
	  }
2380
	  /* else struct results are moved by body of proc */
2388
	  /* else struct results are moved by body of proc */
2381
	}
2389
	}
2382
	return mka;
2390
	return mka;
Line 2384... Line 2392...
2384
 
2392
 
2385
    case return_to_label_tag: {
2393
    case return_to_label_tag: {
2386
	int r = getreg(sp.fixed);
2394
	int r = getreg(sp.fixed);
2387
	where w;
2395
	where w;
2388
	setregalt(w.answhere, r);
2396
	setregalt(w.answhere, r);
2389
	w.ashwhere = ashof (sh(son (e)));
2397
	w.ashwhere = ashof(sh(son(e)));
2390
	code_here (son (e), sp, w);
2398
	code_here(son(e), sp, w);
2391
	clear_all();
2399
	clear_all();
2392
	if (Has_fp) {
2400
	if (Has_fp) {
2393
		baseoff b;
2401
		baseoff b;
2394
		b.base = 30;
2402
		b.base = 30;
2395
		restore_sregs (fixdone, fltdone);
2403
		restore_sregs(fixdone, fltdone);
2396
		if (Has_vcallees) {
2404
		if (Has_vcallees) {
2397
			b.offset = -16;
2405
			b.offset = -16;
2398
			ls_ins(i_lw, local_reg, b);
2406
			ls_ins(i_lw, local_reg, b);
2399
		}
2407
		}
2400
		b.offset = -4;
2408
		b.offset = -4;
2401
		mon_ins(i_move, 29, 30);
2409
		mon_ins(i_move, 29, 30);
2402
		ls_ins(i_lw, 30, b);
2410
		ls_ins(i_lw, 30, b);
2403
	}
2411
	}
2404
	else
2412
	else
2405
	if (frame_size !=0) {
2413
	if (frame_size !=0) {
2406
		restore_sregs (fixdone, fltdone);
2414
		restore_sregs(fixdone, fltdone);
2407
		/* restore dumped value of s-regs on entry */
2415
		/* restore dumped value of s-regs on entry */
2408
		rri_ins (i_addu, 29, 29, frame_size >> 3);
2416
		rri_ins(i_addu, 29, 29, frame_size >> 3);
2409
		/* reset stack ptr */
2417
		/* reset stack ptr */
2410
	}
2418
	}
2411
	uncond_ins(i_j, r);
2419
	uncond_ins(i_j, r);
2412
	return mka;
2420
	return mka;
2413
    }
2421
    }
Line 2416... Line 2424...
2416
 
2424
 
2417
    case res_tag: case untidy_return_tag:
2425
    case res_tag: case untidy_return_tag:
2418
      {
2426
      {
2419
	where w;
2427
	where w;
2420
	w.answhere = procans;
2428
	w.answhere = procans;
2421
	w.ashwhere = ashof (sh (son (e)));
2429
	w.ashwhere = ashof(sh(son(e)));
2422
	code_here (son (e), sp, w);
2430
	code_here(son(e), sp, w);
2423
	/* evaluate result value */
2431
	/* evaluate result value */
2424
 
2432
 
2425
	clear_all ();		/* clear all register memories */
2433
	clear_all ();		/* clear all register memories */
2426
 
2434
 
2427
	if (rscope_level == 0) {/* normal proc body */
2435
	if (rscope_level == 0) {/* normal proc body */
2428
	  if (name(son(e)) == apply_tag && props(e)) return mka;
2436
	  if (name(son(e)) == apply_tag && props(e)) return mka;
2429
	  				/* was a tail recursion */
2437
	  				/* was a tail recursion */
2430
	  if (frame_size == 0
2438
	  if (frame_size == 0
2431
		  && !Has_fp) {
2439
		  && !Has_fp) {
2432
	    uncond_ins (i_j, 31);
2440
	    uncond_ins(i_j, 31);
2433
	  }
2441
	  }
2434
	  else
2442
	  else
2435
	  if (result_label != 0 && name(e)==res_tag) {
2443
	  if (result_label != 0 && name(e) ==res_tag) {
2436
	  	uncond_ins(i_b, result_label);
2444
	  	uncond_ins(i_b, result_label);
2437
	  	if (as_file) fprintf(as_file, " # Return\n");
2445
	  	if (as_file)fprintf(as_file, " # Return\n");
2438
	  }
2446
	  }
2439
	  else{
2447
	  else{
2440
	      	if ((fixdone|fltdone)==0) {
2448
	      	if ((fixdone|fltdone) ==0) {
2441
	  		result_label = new_label();
2449
	  		result_label = new_label();
2442
	  		set_label(result_label);
2450
	  		set_label(result_label);
2443
	     	}
2451
	     	}
2444
	  	if (Has_fp) {
2452
	  	if (Has_fp) {
2445
	  		baseoff b;
2453
	  		baseoff b;
2446
	  		b.base = 30;
2454
	  		b.base = 30;
2447
	  		restore_sregs (fixdone, fltdone);
2455
	  		restore_sregs(fixdone, fltdone);
2448
	  		if (Has_vcallees) {
2456
	  		if (Has_vcallees) {
2449
	  			b.offset = -16;
2457
	  			b.offset = -16;
2450
	  			ls_ins(i_lw, local_reg, b);
2458
	  			ls_ins(i_lw, local_reg, b);
2451
	  		}
2459
	  		}
2452
			b.offset = -4;
2460
			b.offset = -4;
2453
	  		if (name(e)==res_tag) mon_ins(i_move, 29, 30);
2461
	  		if (name(e) ==res_tag)mon_ins(i_move, 29, 30);
2454
	  		ls_ins(i_lw, 30, b);
2462
	  		ls_ins(i_lw, 30, b);
2455
	  	}
2463
	  	}
2456
	  	else {
2464
	  	else {
2457
                	restore_sregs (fixdone, fltdone);
2465
                	restore_sregs(fixdone, fltdone);
2458
                	/* restore dumped value of s-regs on entry */
2466
                	/* restore dumped value of s-regs on entry */
2459
                	if (frame_size != 0 && name(e) == res_tag) {
2467
                	if (frame_size != 0 && name(e) == res_tag) {
2460
                		rri_ins (i_addu, 29, 29, frame_size >> 3);
2468
                		rri_ins(i_addu, 29, 29, frame_size >> 3);
2461
                        }
2469
                        }
2462
                	/* reset stack ptr */
2470
                	/* reset stack ptr */
2463
                }
2471
                }
2464
	      if (diagPIClab != 0) {
2472
	      if (diagPIClab != 0) {
2465
		uncond_ins(i_b, diagPIClab);
2473
		uncond_ins(i_b, diagPIClab);
2466
	      }
2474
	      }
2467
	      else { uncond_ins (i_j, 31); }
2475
	      else { uncond_ins(i_j, 31); }
2468
	    }
2476
	    }
2469
	}
2477
	}
2470
	else {			/* inlined result */
2478
	else {			/* inlined result */
2471
	  if (rscope_label == 0) rscope_label = new_label();
2479
	  if (rscope_label == 0)rscope_label = new_label();
2472
	  if (rscope_label != exitlab) {
2480
	  if (rscope_label != exitlab) {
2473
	    uncond_ins (i_b, rscope_label);
2481
	    uncond_ins(i_b, rscope_label);
2474
	  }
2482
	  }
2475
	}
2483
	}
2476
	return mka;
2484
	return mka;
2477
      }				/* end result */
2485
      }				/* end result */
2478
 
2486
 
2479
    case diagnose_tag: {
2487
    case diagnose_tag: {
2480
    	output_diag(dno(e), 0,e);
2488
    	output_diag(dno(e), 0,e);
2481
    	mka = make_code (son (e), sp, dest, exitlab);
2489
    	mka = make_code(son(e), sp, dest, exitlab);
2482
	output_end_scope(dno(e),e);
2490
	output_end_scope(dno(e),e);
2483
	return mka;
2491
	return mka;
2484
    }
2492
    }
2485
 
2493
 
2486
    /*
2494
    /*
2487
	removed in version 3.0
2495
	removed in version 3.0
2488
     case rscope_tag:
2496
     case rscope_tag:
2489
      {
2497
      {
2490
 
2498
 
2491
	  ans old_procans;
2499
	  ans old_procans;
2492
	  int   old_rscope_label = rscope_label;
2500
	  int   old_rscope_label = rscope_label;
2493
	  if (dest.answhere.discrim == insomereg) {
2501
	  if (dest.answhere.discrim == insomereg) {
2494
 
2502
 
Line 2496... Line 2504...
2496
	    if (*sr != -1) {
2504
	    if (*sr != -1) {
2497
	      failer ("Somereg *2");
2505
	      failer ("Somereg *2");
2498
	    }
2506
	    }
2499
	    *sr = getreg (sp.fixed);
2507
	    *sr = getreg (sp.fixed);
2500
	    setregalt (dest.answhere, *sr);
2508
	    setregalt (dest.answhere, *sr);
2501
	  }
2509
	  }
2502
	  else
2510
	  else
2503
	  if (dest.answhere.discrim == insomefreg) {
2511
	  if (dest.answhere.discrim == insomefreg) {
2504
	       somefreg sfr;
2512
	       somefreg sfr;
2505
	       freg fr;
2513
	       freg fr;
2506
   	       sfr = somefregalt(dest.answhere);
2514
   	       sfr = somefregalt(dest.answhere);
Line 2532... Line 2540...
2532
	}
2540
	}
2533
*/
2541
*/
2534
 
2542
 
2535
    case solve_tag:
2543
    case solve_tag:
2536
      {
2544
      {
2537
	exp m = bro (son (e));
2545
	exp m = bro(son(e));
2538
	int   l = exitlab;
2546
	int   l = exitlab;
2539
	if (dest.answhere.discrim == insomereg) {
2547
	if (dest.answhere.discrim == insomereg) {
2540
	  /* choose register for result */
2548
	  /* choose register for result */
2541
	  int  *sr = someregalt (dest.answhere);
2549
	  int  *sr = someregalt(dest.answhere);
2542
	  if (*sr != -1) {
2550
	  if (*sr != -1) {
2543
	    failer ("Somereg *2");
2551
	    failer("Somereg *2");
2544
	  }
2552
	  }
2545
	  *sr = getreg (sp.fixed);
2553
	  *sr = getreg(sp.fixed);
2546
	  setregalt (dest.answhere, *sr);
2554
	  setregalt(dest.answhere, *sr);
2547
	}
2555
	}
2548
	else
2556
	else
2549
	if (dest.answhere.discrim == insomefreg ){
2557
	if (dest.answhere.discrim == insomefreg) {
2550
	       somefreg sfr;
2558
	       somefreg sfr;
2551
	       freg fr;
2559
	       freg fr;
2552
   	       sfr = somefregalt(dest.answhere);
2560
   	       sfr = somefregalt(dest.answhere);
2553
	       if (*sfr.fr != -1) { failer ("Somefreg *2"); }
2561
	       if (*sfr.fr != -1) { failer("Somefreg *2"); }
2554
	       *sfr.fr = getfreg(sp.flt);
2562
	       *sfr.fr = getfreg(sp.flt);
2555
	       fr.fr = *sfr.fr;
2563
	       fr.fr = *sfr.fr;
2556
	       fr.dble = sfr.dble;
2564
	       fr.dble = sfr.dble;
2557
	       setfregalt(dest.answhere, fr);
2565
	       setfregalt(dest.answhere, fr);
2558
	}
2566
	}
2559
 
2567
 
2560
	for (;;) {		/* set up all the labels in the component
2568
	for (;;) {		/* set up all the labels in the component
2561
				   labst_tags */
2569
				   labst_tags */
2562
	  no (son (m)) = new_label ();
2570
	  no(son(m)) = new_label();
2563
	  if (last (m))
2571
	  if (last(m))
2564
	    break;
2572
	    break;
2565
	  m = bro (m);
2573
	  m = bro(m);
2566
	}
2574
	}
2567
 
2575
 
2568
	m = son (e);
2576
	m = son(e);
2569
	for (;;) {		/* evaluate all the component statements
2577
	for (;;) {		/* evaluate all the component statements
2570
				*/
2578
				*/
2571
	  int   fl = make_code (m, sp, dest, l).lab;
2579
	  int   fl = make_code(m, sp, dest, l).lab;
2572
	  clear_all ();
2580
	  clear_all();
2573
	  if (fl != 0)
2581
	  if (fl != 0)
2574
	    l = fl;
2582
	    l = fl;
2575
	  if (!last (m)) {	/* jump to end of solve */
2583
	  if (!last (m)) {	/* jump to end of solve */
2576
	    if (l == 0)
2584
	    if (l == 0)
2577
	      l = new_label ();
2585
	      l = new_label();
2578
	    if (name (sh (m)) != bothd) {
2586
	    if (name(sh(m))!= bothd) {
2579
	      uncond_ins (i_b, l);
2587
	      uncond_ins(i_b, l);
2580
	    }
2588
	    }
2581
	  }
2589
	  }
2582
	  if (last (m)) {
2590
	  if (last(m)) {
2583
	    mka.lab = l;
2591
	    mka.lab = l;
2584
	    return mka;
2592
	    return mka;
2585
	  };
2593
	  };
2586
	  m = bro (m);
2594
	  m = bro(m);
2587
	}
2595
	}
2588
      }				/* end solve */
2596
      }				/* end solve */
2589
 
2597
 
2590
 
2598
 
2591
 
2599
 
2592
    case case_tag:
2600
    case case_tag:
2593
      {
2601
      {
2594
	int   r = reg_operand (son (e), sp);
2602
	int   r = reg_operand(son(e), sp);
2595
	/* evaluate controlling integer into reg r */
2603
	/* evaluate controlling integer into reg r */
2596
	mm lims;
2604
	mm lims;
2597
	exp z = bro (son (e));
2605
	exp z = bro(son(e));
2598
	exp zt = z;
2606
	exp zt = z;
2599
	long  n;
2607
	long  n;
2600
	long  l;
2608
	long  l;
2601
	long  u = 0x80000000;
2609
	long  u = 0x80000000;
2602
 
2610
 
2603
	sp = guardreg(r,sp);
2611
	sp = guardreg(r,sp);
2604
	l = no (zt);
2612
	l = no(zt);
2605
	for (n = 1;; n++) {	/* calculate crude criterion for using
2613
	for (n = 1;; n++) {	/* calculate crude criterion for using
2606
				   jump vector or branches */
2614
				   jump vector or branches */
2607
	  if (u + 1 != no (zt) && son (zt) != nilexp) {
2615
	  if (u + 1 != no(zt) && son(zt)!= nilexp) {
2608
	    n++;
2616
	    n++;
2609
	  }
2617
	  }
2610
	  if (last (zt)) {
2618
	  if (last(zt)) {
2611
	    u = (son (zt) != nilexp) ? no (son (zt)) : no (zt);
2619
	    u = (son(zt)!= nilexp)? no(son(zt)): no(zt);
2612
	    break;
2620
	    break;
2613
	  }
2621
	  }
2614
	  if (son (zt) != nilexp) {
2622
	  if (son(zt)!= nilexp) {
2615
	    u = no (son (zt));
2623
	    u = no(son(zt));
2616
	  }
2624
	  }
2617
	  else {
2625
	  else {
2618
	    if (u + 1 == no (zt))
2626
	    if (u + 1 == no(zt))
2619
	      u += 1;
2627
	      u += 1;
2620
	  }
2628
	  }
2621
 
2629
 
2622
	  zt = bro (zt);
2630
	  zt = bro(zt);
2623
	}
2631
	}
2624
 
2632
 
2625
	/* now l is lowest controlling value and u is highest */
2633
	/* now l is lowest controlling value and u is highest */
2626
 
2634
 
2627
	if (is_signed(sh(son(e))) ) { u = u/2 - l/2; }
2635
	if (is_signed(sh(son(e)))) { u = u/2 - l/2; }
2628
	else { u = ((unsigned)u)/2 - ((unsigned)l)/2; }
2636
	else { u = ((unsigned)u) /2 - ((unsigned)l) /2; }
2629
 
2637
 
2630
	if ( u <= n * n / 4 -3 /* ware overflow! */) {
2638
	if ( u <= n * n / 4 -3 /* ware overflow! */) {
2631
	  /* space-time product criterion for jump vector instead of tests
2639
	  /* space-time product criterion for jump vector instead of tests
2632
	     and branches *//* use jump vector */
2640
	     and branches *//* use jump vector */
2633
	  int   endlab = new_label ();
2641
	  int   endlab = new_label();
2634
	  int   veclab = next_dlab_sym ();
2642
	  int   veclab = next_dlab_sym();
2635
	  baseoff zeroveclab;
2643
	  baseoff zeroveclab;
2636
	  baseoff zero3;
2644
	  baseoff zero3;
2637
	  int   mr = getreg (sp.fixed);
2645
	  int   mr = getreg(sp.fixed);
2638
	  int r3 = getreg(guardreg(mr,sp).fixed);
2646
	  int r3 = getreg(guardreg(mr,sp).fixed);
2639
	  zero3.base = r3;
2647
	  zero3.base = r3;
2640
	  zero3.offset = 0;
2648
	  zero3.offset = 0;
2641
	  zeroveclab.offset = 0;
2649
	  zeroveclab.offset = 0;
2642
	  zeroveclab.base = veclab;
2650
	  zeroveclab.base = veclab;
2643
	  n = l;
2651
	  n = l;
2644
 
2652
 
2645
	  if (as_file)
2653
	  if (as_file)
2646
	    fprintf (as_file, "\t.rdata\n$$%d:\n", veclab);
2654
	    fprintf(as_file, "\t.rdata\n$$%d:\n", veclab);
2647
	  out_common (0, irdata);
2655
	  out_common(0, irdata);
2648
	  out_common (tempsnos[veclab - 32], ilabel);
2656
	  out_common(tempsnos[veclab - 32], ilabel);
2649
	  for (;;) {
2657
	  for (;;) {
2650
	    for (; no (z) > n; n++) {/* o/p jump vector */
2658
	    for (; no (z) > n; n++) {/* o/p jump vector */
2651
	      if (as_file)
2659
	      if (as_file)
2652
		fprintf (as_file,
2660
		fprintf(as_file,
2653
			(PIC_code)?"\t.gpword\t$%d\n":"\t.word\t$%d\n", endlab);
2661
			(PIC_code)?"\t.gpword\t$%d\n":"\t.word\t$%d\n", endlab);
2654
	      out_value (-endlab, (PIC_code)?igpword:iword, 0, 1);
2662
	      out_value(-endlab,(PIC_code)?igpword:iword, 0, 1);
2655
	    }
2663
	    }
2656
	    u = (son (z) == nilexp) ? n : no (son (z));
2664
	    u = (son(z) == nilexp)? n : no(son(z));
2657
	    for (; n <= u; n++) {
2665
	    for (; n <= u; n++) {
2658
	      props(son(pt(z))) = 1; /* as bug - see labst_tag */
2666
	      props(son(pt(z))) = 1; /* as bug - see labst_tag */
2659
	      if (as_file)
2667
	      if (as_file)
2660
		fprintf (as_file,
2668
		fprintf(as_file,
2661
			 (PIC_code)?"\t.gpword\t$%d\n":"\t.word\t$%d\n", no (son (pt (z))));
2669
			(PIC_code)?"\t.gpword\t$%d\n":"\t.word\t$%d\n", no(son(pt(z))));
2662
	      out_value (-no (son (pt (z))), (PIC_code)?igpword:iword, 0, 1);
2670
	      out_value(-no(son(pt(z))), (PIC_code)?igpword:iword, 0, 1);
2663
	    }
2671
	    }
2664
	    if (last (z))
2672
	    if (last(z))
2665
	      break;
2673
	      break;
2666
	    z = bro (z);
2674
	    z = bro(z);
2667
	  }
2675
	  }
2668
 
2676
 
2669
	  if (as_file)
2677
	  if (as_file)
2670
	    fprintf (as_file, "\t.text\n");
2678
	    fprintf(as_file, "\t.text\n");
2671
	  out_common (0, itext);
2679
	  out_common(0, itext);
2672
 
2680
 
2673
	  ls_ins (i_la, r3, zeroveclab);
2681
	  ls_ins(i_la, r3, zeroveclab);
2674
	  if (l != 0) {
2682
	  if (l != 0) {
2675
	    rri_ins (i_addu, mr, r, -l);
2683
	    rri_ins(i_addu, mr, r, -l);
2676
	    condri_ins (i_bgeu, mr, u - l + 1, endlab);
2684
	    condri_ins(i_bgeu, mr, u - l + 1, endlab);
2677
	    rri_ins (i_mul, mr, mr, 4);
2685
	    rri_ins(i_mul, mr, mr, 4);
2678
	  }
2686
	  }
2679
	  else {
2687
	  else {
2680
	    condri_ins (i_bgeu, r, u + 1, endlab);
2688
	    condri_ins(i_bgeu, r, u + 1, endlab);
2681
	    rri_ins (i_mul, mr, r, 4);
2689
	    rri_ins(i_mul, mr, r, 4);
2682
	  }
2690
	  }
2683
	  rrr_ins (i_addu, r3, r3, mr);
2691
	  rrr_ins(i_addu, r3, r3, mr);
2684
	  ls_ins (i_lw, r3, zero3);
2692
	  ls_ins(i_lw, r3, zero3);
2685
	  if (PIC_code) {  rrr_ins(i_addu, r3, r3, 28); }
2693
	  if (PIC_code) {  rrr_ins(i_addu, r3, r3, 28); }
2686
	  uncond_ins (i_j, r3);
2694
	  uncond_ins(i_j, r3);
2687
	  set_label (endlab);
2695
	  set_label(endlab);
2688
	  return mka;
2696
	  return mka;
2689
	}
2697
	}
2690
	else
2698
	else
2691
	if (is_signed(sh(son(e)))) {
2699
	if (is_signed(sh(son(e)))) {
2692
	  int   over = 0;	/* use branches - tests are already
2700
	  int   over = 0;	/* use branches - tests are already
2693
				   ordered */
2701
				   ordered */
2694
	  bool usw;
2702
	  bool usw;
2695
	  lims = maxmin (sh (son (e)));
2703
	  lims = maxmin(sh(son(e)));
2696
	  for (;;) {
2704
	  for (;;) {
2697
	    int   lab = no (son (pt (z)));
2705
	    int   lab = no(son(pt(z)));
2698
	    long l = no (z);
2706
	    long l = no(z);
2699
	    if (son (z) == nilexp) {/* only single test required */
2707
	    if (son (z) == nilexp) {/* only single test required */
2700
	      condri_ins (i_beq, r, l, lab);
2708
	      condri_ins(i_beq, r, l, lab);
2701
	      if (l == lims.maxi)
2709
	      if (l == lims.maxi)
2702
		lims.maxi -= 1;
2710
		lims.maxi -= 1;
2703
	      else
2711
	      else
2704
		if (l == lims.mini)
2712
		if (l == lims.mini)
2705
		  lims.mini += 1;
2713
		  lims.mini += 1;
2706
	    }
2714
	    }
2707
	    else
2715
	    else
2708
	      if (u = no (son (z)), l > lims.mini) {
2716
	      if (u = no(son(z)), l > lims.mini) {
2709
		if ( u >= lims.maxi)
2717
		if (u >= lims.maxi)
2710
		{/* have already tested lower */
2718
		{/* have already tested lower */
2711
		  condri_ins (i_bge, r, l, lab);
2719
		  condri_ins(i_bge, r, l, lab);
2712
		  lims.maxi = l - 1;
2720
		  lims.maxi = l - 1;
2713
		}
2721
		}
2714
		else {
2722
		else {
2715
		  if (over == 0) {
2723
		  if (over == 0) {
2716
		    over = new_label ();
2724
		    over = new_label();
2717
		  }
2725
		  }
2718
		  condri_ins (i_blt, r, l, over);
2726
		  condri_ins(i_blt, r, l, over);
2719
		  condri_ins (i_ble, r, u, lab);
2727
		  condri_ins(i_ble, r, u, lab);
2720
		  lims.mini = u + 1;
2728
		  lims.mini = u + 1;
2721
		}
2729
		}
2722
	      }
2730
	      }
2723
	      else		/* lower is <= lower limit of shape */
2731
	      else		/* lower is <= lower limit of shape */
2724
		if (u < lims.maxi) {
2732
		if (u < lims.maxi) {
2725
		  condri_ins (i_ble, r, u, lab);
2733
		  condri_ins(i_ble, r, u, lab);
2726
		  lims.mini = u + 1;
2734
		  lims.mini = u + 1;
2727
		}
2735
		}
2728
		else {		/* upper is >= upper limit of shape */
2736
		else {		/* upper is >= upper limit of shape */
2729
		  uncond_ins (i_b, lab);
2737
		  uncond_ins(i_b, lab);
2730
		}
2738
		}
2731
	    if (last (z)) {
2739
	    if (last(z)) {
2732
	      if (over != 0) {
2740
	      if (over != 0) {
2733
		set_label (over);
2741
		set_label(over);
2734
	      } return mka;
2742
	      } return mka;
2735
	    }
2743
	    }
2736
	    z = bro (z);
2744
	    z = bro(z);
2737
	  }
2745
	  }
2738
	}
2746
	}
2739
	else {
2747
	else {
2740
	  int   over = 0;	/* use branches - tests are already
2748
	  int   over = 0;	/* use branches - tests are already
2741
				   ordered */
2749
				   ordered */
2742
	  unsigned long maxi;
2750
	  unsigned long maxi;
2743
	  unsigned long mini;
2751
	  unsigned long mini;
2744
	  lims = maxmin (sh (son (e)));
2752
	  lims = maxmin(sh(son(e)));
2745
	  maxi = (unsigned)lims.maxi;
2753
	  maxi = (unsigned)lims.maxi;
2746
	  mini = (unsigned)lims.mini;
2754
	  mini = (unsigned)lims.mini;
2747
	  for (;;) {
2755
	  for (;;) {
2748
	    int   lab = no (son (pt (z)));
2756
	    int   lab = no(son(pt(z)));
2749
	    unsigned long l = no (z);
2757
	    unsigned long l = no(z);
2750
	    if (son (z) == nilexp) {/* only single test required */
2758
	    if (son (z) == nilexp) {/* only single test required */
2751
	      condri_ins (i_beq, r, l, lab);
2759
	      condri_ins(i_beq, r, l, lab);
2752
	      if (l == maxi)
2760
	      if (l == maxi)
2753
		maxi -= 1;
2761
		maxi -= 1;
2754
	      else
2762
	      else
2755
		if (l == mini)
2763
		if (l == mini)
2756
		  mini += 1;
2764
		  mini += 1;
2757
	    }
2765
	    }
2758
	    else
2766
	    else
2759
	      if (u = no (son (z)), l > mini) {
2767
	      if (u = no(son(z)), l > mini) {
2760
		if ( u >= maxi)
2768
		if (u >= maxi)
2761
		{/* have already tested lower */
2769
		{/* have already tested lower */
2762
		  condri_ins (i_bgeu, r, l, lab);
2770
		  condri_ins(i_bgeu, r, l, lab);
2763
		  maxi = l - 1;
2771
		  maxi = l - 1;
2764
		}
2772
		}
2765
		else {
2773
		else {
2766
		  if (over == 0) {
2774
		  if (over == 0) {
2767
		    over = new_label ();
2775
		    over = new_label();
2768
		  }
2776
		  }
2769
		  condri_ins (i_bltu, r, l, over);
2777
		  condri_ins(i_bltu, r, l, over);
2770
		  condri_ins (i_bleu, r, u, lab);
2778
		  condri_ins(i_bleu, r, u, lab);
2771
		  mini = u + 1;
2779
		  mini = u + 1;
2772
		}
2780
		}
2773
	      }
2781
	      }
2774
	      else		/* lower is <= lower limit of shape */
2782
	      else		/* lower is <= lower limit of shape */
2775
		if (u < maxi) {
2783
		if (u < maxi) {
2776
		  condri_ins (i_bleu, r, u, lab);
2784
		  condri_ins(i_bleu, r, u, lab);
2777
		  mini = u + 1;
2785
		  mini = u + 1;
2778
		}
2786
		}
2779
		else {		/* upper is >= upper limit of shape */
2787
		else {		/* upper is >= upper limit of shape */
2780
		  uncond_ins (i_b, lab);
2788
		  uncond_ins(i_b, lab);
2781
		}
2789
		}
2782
	    if (last (z)) {
2790
	    if (last(z)) {
2783
	      if (over != 0) {
2791
	      if (over != 0) {
2784
		set_label (over);
2792
		set_label(over);
2785
	      } return mka;
2793
	      } return mka;
2786
	    }
2794
	    }
2787
	    z = bro (z);
2795
	    z = bro(z);
2788
	  }
2796
	  }
2789
	}
2797
	}
2790
 
2798
 
2791
      }				/* end case */
2799
      }				/* end case */
2792
 
2800
 
Line 2798... Line 2806...
2798
	space nsp;
2806
	space nsp;
2799
	ans aa;
2807
	ans aa;
2800
	tmp = getreg(sp.fixed);
2808
	tmp = getreg(sp.fixed);
2801
	rri_ins(i_sll, tmp, r1, 3);
2809
	rri_ins(i_sll, tmp, r1, 3);
2802
	d = regfrmdest(&dest, sp);
2810
	d = regfrmdest(&dest, sp);
2803
	if (name(r)==val_tag) {
2811
	if (name(r) ==val_tag) {
2804
		rri_ins(i_addu, d, tmp, no(r));
2812
		rri_ins(i_addu, d, tmp, no(r));
2805
	}
2813
	}
2806
	else {
2814
	else {
2807
		nsp = guardreg(tmp, sp);
2815
		nsp = guardreg(tmp, sp);
2808
		r2 = reg_operand(r, nsp);
2816
		r2 = reg_operand(r, nsp);
Line 2834... Line 2842...
2834
 
2842
 
2835
 
2843
 
2836
 
2844
 
2837
    case plus_tag:
2845
    case plus_tag:
2838
      {
2846
      {
2839
        if (optop(e) ) {
2847
        if (optop(e)) {
-
 
2848
          mka.regmove =
-
 
2849
            comm_op(e, sp, dest, i_addu);
-
 
2850
          return mka;
-
 
2851
        }
-
 
2852
       if ((errhandle(e) &3) ==3 && is_signed(sh(e)) && shape_size(sh(e)) ==32) {
2840
          mka.regmove =
2853
          mka.regmove =
2841
            comm_op (e, sp, dest, i_addu);
-
 
2842
          return mka;
-
 
2843
        }
-
 
2844
       if ((errhandle(e)&3)==3 && is_signed(sh(e)) && shape_size(sh(e))==32 ) {
-
 
2845
          mka.regmove =
-
 
2846
            comm_op (e, sp, dest, i_add);
2854
            comm_op(e, sp, dest, i_add);
2847
          return mka;
2855
          return mka;
2848
        }
2856
        }
2849
        else {
2857
        else {
2850
          /* possible overflow - can optimised a bit fot lit. operand*/
2858
          /* possible overflow - can optimised a bit fot lit. operand*/
2851
          int r1 = reg_operand(son(e), sp);
2859
          int r1 = reg_operand(son(e), sp);
Line 2859... Line 2867...
2859
          nsp = guardreg(r2, nsp);
2867
          nsp = guardreg(r2, nsp);
2860
          r0 = getreg(nsp.fixed);
2868
          r0 = getreg(nsp.fixed);
2861
          nsp = guardreg(r0, nsp);
2869
          nsp = guardreg(r0, nsp);
2862
          rrr_ins(i_addu, r0, r1, r2);
2870
          rrr_ins(i_addu, r0, r1, r2);
2863
 
2871
 
2864
          switch(name(sh(e)) ) {
2872
          switch (name(sh(e))) {
2865
             case slonghd: {
2873
             case slonghd: {
2866
             	r3 = getreg(nsp.fixed);
2874
             	r3 = getreg(nsp.fixed);
2867
          	rrr_ins(i_xor, r3, r1, r2);
2875
          	rrr_ins(i_xor, r3, r1, r2);
2868
 
2876
 
2869
          	condr_ins(i_bltz, r3, over);
2877
          	condr_ins(i_bltz, r3, over);
Line 2877... Line 2885...
2877
             	r3 = getreg(nsp.fixed);
2885
             	r3 = getreg(nsp.fixed);
2878
          	mon_ins(i_not, r3, r1);
2886
          	mon_ins(i_not, r3, r1);
2879
          	rrr_ins(i_sltu, r3, r3, r2);
2887
          	rrr_ins(i_sltu, r3, r3, r2);
2880
          	condrr_ins(i_bne, r3, 0, trap);
2888
          	condrr_ins(i_bne, r3, 0, trap);
2881
          	break;
2889
          	break;
2882
             }
2890
             }
2883
             case scharhd: {
2891
             case scharhd: {
2884
                testsigned(r0, -128, 127, trap);
2892
                testsigned(r0, -128, 127, trap);
2885
                break;
2893
                break;
2886
             }
2894
             }
2887
             case ucharhd: {
2895
             case ucharhd: {
2888
                testusigned(r0, 255, trap);
2896
                testusigned(r0, 255, trap);
2889
                break;
2897
                break;
2890
             }
2898
             }
2891
             case swordhd: {
2899
             case swordhd: {
2892
                testsigned(r0, -0x8000, 0x7fff, trap);
2900
                testsigned(r0, -0x8000, 0x7fff, trap);
2893
                break;
2901
                break;
2894
             }
2902
             }
2895
             case uwordhd: {
2903
             case uwordhd: {
2896
                testusigned(r0, 0xffff, trap);
2904
                testusigned(r0, 0xffff, trap);
2897
                break;
2905
                break;
2898
             }
2906
             }
2899
             default: failer("NOT integer in plus with o/f");
2907
             default: failer("NOT integer in plus with o/f");
2900
          }
2908
          }
2901
          setregalt(aa, r0);
2909
          setregalt(aa, r0);
2902
          mka.regmove = move(aa, dest, nsp, 0);
2910
          mka.regmove = move(aa, dest, nsp, 0);
2903
          return mka;
2911
          return mka;
Line 2908... Line 2916...
2908
    case chvar_tag:
2916
    case chvar_tag:
2909
      {
2917
      {
2910
	int   a;
2918
	int   a;
2911
	int   d;
2919
	int   d;
2912
	ans aa;
2920
	ans aa;
2913
	int   nsh = name (sh (e));
2921
	int   nsh = name(sh(e));
2914
	if (!BIGEND && dest.answhere.discrim == inreg
2922
	if (!BIGEND && dest.answhere.discrim == inreg
2915
		&& regalt(dest.answhere) != 0) {
2923
		&& regalt(dest.answhere)!= 0) {
2916
	      ash arga;
2924
	      ash arga;
2917
	      arga = ashof (sh (son (e)));
2925
	      arga = ashof(sh(son(e)));
2918
	      if (arga.ashsize <= dest.ashwhere.ashsize) {
2926
	      if (arga.ashsize <= dest.ashwhere.ashsize) {
2919
		dest.ashwhere = arga;
2927
		dest.ashwhere = arga;
2920
	      }
2928
	      }
2921
	      a = regalt (dest.answhere);
2929
	      a = regalt(dest.answhere);
2922
	      code_here (son (e), sp, dest);
2930
	      code_here(son(e), sp, dest);
2923
	      /* evaluate arguement into reg */
2931
	      /* evaluate arguement into reg */
2924
	}
2932
	}
2925
	else {
2933
	else {
2926
	      a = reg_operand (son (e), sp);
2934
	      a = reg_operand(son(e), sp);
2927
	      /* evaluate arguement into a */
2935
	      /* evaluate arguement into a */
2928
	}
2936
	}
2929
	setregalt (aa, a);
2937
	setregalt(aa, a);
2930
	if (!optop(e)) {
2938
	if (!optop(e)) {
2931
		long trap = trap_label(e);
2939
		long trap = trap_label(e);
2932
		bool sg = is_signed(sh(son(e)));
2940
		bool sg = is_signed(sh(son(e)));
2933
		switch(nsh) {
2941
		switch (nsh) {
2934
		case scharhd:
2942
		case scharhd:
2935
	           	if (sg) { testsigned(a, -128, 127, trap);}
2943
	           	if (sg) { testsigned(a, -128, 127, trap);}
2936
			else { testusigned(a, 127, trap); }
2944
			else { testusigned(a, 127, trap); }
2937
			break;
2945
			break;
2938
		case ucharhd: testusigned(a, 255, trap); break;
2946
		case ucharhd: testusigned(a, 255, trap); break;
2939
		case swordhd:
2947
		case swordhd:
2940
			if (sg){ testsigned(a, -0x8000, 0x7fff, trap); }
2948
			if (sg) { testsigned(a, -0x8000, 0x7fff, trap); }
2941
			else { testusigned(a, 0x7fff, trap); }
2949
			else { testusigned(a, 0x7fff, trap); }
2942
			break;
2950
			break;
2943
		case uwordhd: testusigned(a, 0xffff, trap); break;
2951
		case uwordhd: testusigned(a, 0xffff, trap); break;
2944
		case slonghd:
2952
		case slonghd:
2945
			if (!sg) { testusigned(a, 0x7fffffff, trap); }
2953
			if (!sg) { testusigned(a, 0x7fffffff, trap); }
2946
			break;
2954
			break;
2947
		case ulonghd:
2955
		case ulonghd:
2948
			if (sg) { testusigned(a, 0x7fffffff, trap); }
2956
			if (sg) { testusigned(a, 0x7fffffff, trap); }
2949
			break;
2957
			break;
2950
		}
2958
		}
2951
		mka.regmove = move (aa, dest, sp, 1);
2959
		mka.regmove = move(aa, dest, sp, 1);
2952
		return mka;
2960
		return mka;
2953
	}
2961
	}
2954
 
2962
 
2955
	if (sh (son (e)) == sh (e) || nsh  >= slonghd) {
2963
	if (sh(son(e)) == sh(e) || nsh  >= slonghd) {
2956
	  /* no changes required, so just move */
2964
	  /* no changes required, so just move */
2957
	  mka.regmove = move (aa, dest, sp, 1);
2965
	  mka.regmove = move(aa, dest, sp, 1);
2958
	  return mka;
2966
	  return mka;
2959
	}
2967
	}
2960
 
2968
 
2961
	switch (dest.answhere.discrim) {
2969
	switch (dest.answhere.discrim) {
2962
	  case insomereg:
2970
	  case insomereg:
2963
	    {
2971
	    {
2964
	      int  *dr = someregalt (dest.answhere);
2972
	      int  *dr = someregalt(dest.answhere);
2965
	      d = getreg (sp.fixed);
2973
	      d = getreg(sp.fixed);
2966
	      *dr = d;
2974
	      *dr = d;
2967
	      goto out;
2975
	      goto out;
2968
	    }
2976
	    }
2969
	  case inreg:
2977
	  case inreg:
2970
	    {
2978
	    {
2971
	      d = regalt (dest.answhere);
2979
	      d = regalt(dest.answhere);
2972
	      goto out;
2980
	      goto out;
2973
	    }
2981
	    }
2974
	  default:
2982
	  default:
2975
	    /* representation in store will be same so just move */
2983
	    /* representation in store will be same so just move */
2976
	    {
2984
	    {
2977
	      move (aa, dest, sp, 1);
2985
	      move(aa, dest, sp, 1);
2978
	      return mka;
2986
	      return mka;
2979
	    }
2987
	    }
2980
	}
2988
	}
2981
 
2989
 
2982
    out: 			/* d is destination register - do
2990
    out: 			/* d is destination register - do
2983
				   appropriate ands etc */
2991
				   appropriate ands etc */
2984
	if (d==0) return mka;
2992
	if (d==0) return mka;
2985
 
2993
 
2986
	if (nsh == ucharhd) {
2994
	if (nsh == ucharhd) {
2987
	  rri_ins (i_and, d, a, 255);
2995
	  rri_ins(i_and, d, a, 255);
2988
	}
2996
	}
2989
	else
2997
	else
2990
	  if (nsh == uwordhd) {
2998
	  if (nsh == uwordhd) {
2991
	    rri_ins (i_and, d, a, (1 << 16) - 1);
2999
	    rri_ins(i_and, d, a,(1 << 16) - 1);
2992
	  }
3000
	  }
2993
	  else
3001
	  else
2994
	    if (nsh == scharhd) {
3002
	    if (nsh == scharhd) {
2995
	      rri_ins (i_sll, d, a, 24);
3003
	      rri_ins(i_sll, d, a, 24);
2996
	      rri_ins (i_sra, d, d, 24);
3004
	      rri_ins(i_sra, d, d, 24);
2997
	    }
3005
	    }
2998
	    else
3006
	    else
2999
	      if (nsh == swordhd) {
3007
	      if (nsh == swordhd) {
3000
		rri_ins (i_sll, d, a, 16);
3008
		rri_ins(i_sll, d, a, 16);
3001
		rri_ins (i_sra, d, d, 16);
3009
		rri_ins(i_sra, d, d, 16);
3002
	      }
3010
	      }
3003
	mka.regmove = d;
3011
	mka.regmove = d;
3004
	return mka;
3012
	return mka;
3005
      }				/* end chvar */
3013
      }				/* end chvar */
3006
 
3014
 
3007
    case minus_tag:
3015
    case minus_tag:
3008
      {
3016
      {
3009
        if (optop(e)) {
3017
        if (optop(e)) {
3010
          mka.regmove =
3018
          mka.regmove =
3011
            non_comm_op (e, sp, dest, i_subu);
3019
            non_comm_op(e, sp, dest, i_subu);
3012
          return mka;
3020
          return mka;
3013
        }
3021
        }
3014
        else
3022
        else
3015
	if ((errhandle(e)&3)==3 && is_signed(sh(e)) && shape_size(sh(e))==32 ) {
3023
	if ((errhandle(e) &3) ==3 && is_signed(sh(e)) && shape_size(sh(e)) ==32) {
3016
          mka.regmove =
3024
          mka.regmove =
3017
            non_comm_op (e, sp, dest, i_sub);
3025
            non_comm_op(e, sp, dest, i_sub);
3018
          return mka;
3026
          return mka;
3019
        }
3027
        }
3020
        else {
3028
        else {
3021
          /* possible overflow - can optimised a bit for lit. operand*/
3029
          /* possible overflow - can optimised a bit for lit. operand*/
3022
          int r1 = reg_operand(son(e), sp);
3030
          int r1 = reg_operand(son(e), sp);
Line 3029... Line 3037...
3029
          r2 = reg_operand(bro(son(e)), nsp);
3037
          r2 = reg_operand(bro(son(e)), nsp);
3030
          nsp = guardreg(r2, nsp);
3038
          nsp = guardreg(r2, nsp);
3031
          r0 = getreg(nsp.fixed);
3039
          r0 = getreg(nsp.fixed);
3032
          nsp = guardreg(r0,nsp);
3040
          nsp = guardreg(r0,nsp);
3033
          rrr_ins(i_subu, r0, r1, r2);
3041
          rrr_ins(i_subu, r0, r1, r2);
3034
          switch(name(sh(e))) {
3042
          switch (name(sh(e))) {
3035
             case slonghd: {
3043
             case slonghd: {
3036
             	r3 = getreg(nsp.fixed);
3044
             	r3 = getreg(nsp.fixed);
3037
             	rrr_ins(i_xor, r3, r1, r2);
3045
             	rrr_ins(i_xor, r3, r1, r2);
3038
 
3046
 
3039
             	condr_ins(i_bgez, r3, over);
3047
             	condr_ins(i_bgez, r3, over);
3040
             	rrr_ins(i_xor, r3, r0, r1);
3048
             	rrr_ins(i_xor, r3, r0, r1);
Line 3076... Line 3084...
3076
 
3084
 
3077
    }				/* end minus */
3085
    }				/* end minus */
3078
 
3086
 
3079
    case mult_tag: case offset_mult_tag:
3087
    case mult_tag: case offset_mult_tag:
3080
      {
3088
      {
3081
	exp rop = bro (son (e));
3089
	exp rop = bro(son(e));
3082
	if (!optop(e)) {	/* test for overflo */
3090
	if (!optop(e)) {	/* test for overflo */
3083
          int r1 = reg_operand(son(e), sp);
3091
          int r1 = reg_operand(son(e), sp);
3084
          int r2, r3, r0;
3092
          int r2, r3, r0;
3085
          long trap = trap_label(e);
3093
          long trap = trap_label(e);
3086
          space nsp;
3094
          space nsp;
Line 3089... Line 3097...
3089
          r2 = reg_operand(bro(son(e)), nsp);
3097
          r2 = reg_operand(bro(son(e)), nsp);
3090
          nsp = guardreg(r2, nsp);
3098
          nsp = guardreg(r2, nsp);
3091
          r0 = getreg(nsp.fixed);
3099
          r0 = getreg(nsp.fixed);
3092
          nsp = guardreg(r0, nsp);
3100
          nsp = guardreg(r0, nsp);
3093
          r3 = getreg(nsp.fixed);
3101
          r3 = getreg(nsp.fixed);
3094
          switch(name(sh(e))) {
3102
          switch (name(sh(e))) {
3095
             case slonghd: {
3103
             case slonghd: {
3096
                int r4;
3104
                int r4;
3097
		mon_ins(i_mult, r1, r2);
3105
		mon_ins(i_mult, r1, r2);
3098
		hilo_ins(i_mflo, r0);
3106
		hilo_ins(i_mflo, r0);
3099
		hilo_ins(i_mfhi, r3);
3107
		hilo_ins(i_mfhi, r3);
Line 3136... Line 3144...
3136
          return mka;
3144
          return mka;
3137
      }
3145
      }
3138
 
3146
 
3139
 
3147
 
3140
 
3148
 
3141
	if (last (rop) && name (rop) == val_tag) {
3149
	if (last(rop) && name(rop) == val_tag) {
3142
	  /* multiplication by constant m */
3150
	  /* multiplication by constant m */
3143
	  int   m = no (rop);
3151
	  int   m = no(rop);
3144
	  int   p2;
3152
	  int   p2;
3145
	  if (m > 1 && (
3153
	  if (m > 1 && (
3146
		((p2 = m) & (m - 1)) == 0 ||
3154
		((p2 = m) & (m - 1)) == 0 ||
3147
		(m & (p2 = m + 1)) == 0 ||
3155
		(m & (p2 = m + 1)) == 0 ||
3148
		((p2 = m - 1) & (m - 2)) == 0
3156
		((p2 = m - 1) & (m - 2)) == 0
3149
	      )
3157
	     )
3150
	    ) {			/* m = 2^shleng   or  m = 2^(shleng +/- 1)
3158
	    ) {			/* m = 2^shleng   or  m = 2^(shleng +/- 1)
3151
				*/
3159
				*/
3152
	    int   r = reg_operand (son (e), sp);
3160
	    int   r = reg_operand(son(e), sp);
3153
	    /* evaluate first arguement */
3161
	    /* evaluate first arguement */
3154
	    int   rr;
3162
	    int   rr;
3155
	    space nsp;
3163
	    space nsp;
3156
	    int   shleng;
3164
	    int   shleng;
3157
	    ans aa;
3165
	    ans aa;
Line 3159... Line 3167...
3159
	      p2 >>= 1;
3167
	      p2 >>= 1;
3160
 
3168
 
3161
	    switch (dest.answhere.discrim) {
3169
	    switch (dest.answhere.discrim) {
3162
	      case inreg:
3170
	      case inreg:
3163
		{
3171
		{
3164
		  rr = regalt (dest.answhere);
3172
		  rr = regalt(dest.answhere);
3165
		  if (rr != r || (m & (m - 1)) == 0) {
3173
		  if (rr != r || (m & (m - 1)) == 0) {
3166
		    nsp = sp;
3174
		    nsp = sp;
3167
		    break;
3175
		    break;
3168
		  }
3176
		  }
3169
		  /* else continue to next case */
3177
		  /* else continue to next case */
3170
		}
3178
		}
3171
	      default:
3179
	      default:
3172
		{
3180
		{
3173
		 	if ((m &(m-1))==0) {
3181
		 	if ((m & (m-1)) ==0) {
3174
				rr = getreg(sp.fixed);
3182
				rr = getreg(sp.fixed);
3175
				nsp = sp;
3183
				nsp = sp;
3176
			}
3184
			}
3177
			else {
3185
			else {
3178
				nsp = guardreg (r, sp);
3186
				nsp = guardreg(r, sp);
3179
		  		rr = getreg (nsp.fixed);
3187
		  		rr = getreg(nsp.fixed);
3180
			}
3188
			}
3181
		}
3189
		}
3182
	    }
3190
	    }
3183
 
3191
 
3184
	    rri_ins (i_sll, rr, r, shleng);
3192
	    rri_ins(i_sll, rr, r, shleng);
3185
 
3193
 
3186
	    if ((m & (m - 1)) != 0)
3194
	    if ((m & (m - 1))!= 0)
3187
	      rrr_ins (((m & (m + 1)) == 0) ? i_subu : i_addu, rr, rr, r);
3195
	      rrr_ins(((m & (m + 1)) == 0)? i_subu : i_addu, rr, rr, r);
3188
	    setregalt (aa, rr);
3196
	    setregalt(aa, rr);
3189
	    mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
3197
	    mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
3190
	    return mka;
3198
	    return mka;
3191
	  }
3199
	  }
3192
	}			/* else do straightforward mult */
3200
	}			/* else do straightforward mult */
3193
 
3201
 
3194
	mka.regmove = comm_op (e, sp, dest, i_mul);
3202
	mka.regmove = comm_op(e, sp, dest, i_mul);
3195
	return mka;
3203
	return mka;
3196
      }				/* end mult */
3204
      }				/* end mult */
3197
 
3205
 
3198
 
3206
 
3199
 
3207
 
3200
    case div0_tag:case div2_tag: case offset_div_by_int_tag: case offset_div_tag:
3208
    case div0_tag:case div2_tag: case offset_div_by_int_tag: case offset_div_tag:
3201
      {
3209
      {
3202
	exp rop = bro (son (e));
3210
	exp rop = bro(son(e));
3203
	exp lop = son(e);
3211
	exp lop = son(e);
3204
	bool uns = !(is_signed(sh (e)));
3212
	bool uns = !(is_signed(sh(e)));
3205
	int trap;
3213
	int trap;
3206
	space nsp;
3214
	space nsp;
3207
	int r0, r1, r2;
3215
	int r0, r1, r2;
3208
	ans aa;
3216
	ans aa;
3209
	if ( name (rop) == val_tag ) {
3217
	if (name(rop) == val_tag) {
3210
	  /* division by constant */
3218
	  /* division by constant */
3211
	  int   m = no (rop);
3219
	  int   m = no(rop);
3212
	  if (m==1) {
3220
	  if (m==1) {
3213
		e = lop;
3221
		e = lop;
3214
		goto tailrecurse;
3222
		goto tailrecurse;
3215
	  }
3223
	  }
3216
	  if ((name(e) == div0_tag || uns) && m > 1 && (m & (m - 1)) == 0) {
3224
	  if ((name(e) == div0_tag || uns) && m > 1 && (m & (m - 1)) == 0) {
3217
	      int   r = reg_operand (son (e), sp);
3225
	      int   r = reg_operand(son(e), sp);
3218
	       /* replace div by 2^shleng by sh right shleng */
3226
	       /* replace div by 2^shleng by sh right shleng */
3219
              int   shleng;
3227
              int   shleng;
3220
              int   rr;
3228
              int   rr;
3221
              for (shleng = 0; m != 1; shleng++)
3229
              for (shleng = 0; m != 1; shleng++)
3222
                m >>= 1;
3230
                m >>= 1;
3223
 
3231
 
3224
              rr = regfrmdest(&dest, sp);
3232
              rr = regfrmdest(&dest, sp);
3225
              rri_ins ( (uns)?i_srl:i_sra, rr, r, shleng);
3233
              rri_ins((uns)?i_srl:i_sra, rr, r, shleng);
3226
              setregalt (aa, rr);
3234
              setregalt(aa, rr);
3227
              mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
3235
              mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
3228
              return mka;
3236
              return mka;
3229
          }
3237
          }
3230
	}
3238
	}
3231
 
3239
 
3232
	r1 = reg_operand(lop, sp);
3240
	r1 = reg_operand(lop, sp);
3233
	nsp = guardreg(r1, sp);
3241
	nsp = guardreg(r1, sp);
3234
	r2 = reg_operand(rop, nsp);
3242
	r2 = reg_operand(rop, nsp);
3235
 
3243
 
3236
	if (!optop(e)|| (errhandle(e)&3)==2) { /* test for (-inf)/-1 and /0 */
3244
	if (!optop(e)|| (errhandle(e)&3)==2) { /* test for (-inf)/-1 and /0 */
3237
	   long over = new_label();
3245
	   long over = new_label();
3238
           trap = ((errhandle(e)&3)==2)?new_label():trap_label(e);
3246
           trap = ((errhandle(e) &3) ==2)?new_label():trap_label(e);
3239
	   condri_ins(i_beq, r2, 0, trap);
3247
	   condri_ins(i_beq, r2, 0, trap);
3240
	   if (!uns) {
3248
	   if (!uns) {
3241
             condri_ins(i_bne, r2, -1, over);
3249
             condri_ins(i_bne, r2, -1, over);
3242
             condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3250
             condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3243
             set_label(over);
3251
             set_label(over);
3244
           }
3252
           }
3245
	}
3253
	}
3246
	r0 = regfrmdest(&dest,sp);
3254
	r0 = regfrmdest(&dest,sp);
3247
	rrr_ins((uns)?i_divu:i_div, r0, r1, r2);
3255
	rrr_ins((uns)?i_divu:i_div, r0, r1, r2);
3248
	if ((errhandle(e)&3)==2) set_label(trap);
3256
	if ((errhandle(e) &3) ==2)set_label(trap);
3249
	setregalt(aa, r0);
3257
	setregalt(aa, r0);
3250
	mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
3258
	mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
3251
	return mka;
3259
	return mka;
3252
      }
3260
      }
3253
 
3261
 
3254
      case div1_tag:
3262
      case div1_tag:
3255
 
3263
 
3256
      {  /* only applies to signed operands */
3264
      {  /* only applies to signed operands */
3257
	exp rop = bro (son (e));
3265
	exp rop = bro(son(e));
3258
	exp lop = son(e);
3266
	exp lop = son(e);
3259
	space nsp;
3267
	space nsp;
3260
	int r0, r1, r2;
3268
	int r0, r1, r2;
3261
	int lab, treg, trap;
3269
	int lab, treg, trap;
3262
	ans aa;
3270
	ans aa;
3263
 
3271
 
3264
	if (name (rop) == val_tag ) {/*  division by constant */
3272
	if (name (rop) == val_tag ) {/*  division by constant */
3265
	  int   m = no (rop);
3273
	  int   m = no(rop);
3266
	  if (m > 1 && (m & (m - 1)) == 0) {
3274
	  if (m > 1 && (m & (m - 1)) == 0) {
3267
	      int   r = reg_operand (son (e), sp);
3275
	      int   r = reg_operand(son(e), sp);
3268
	       /* replace div by 2^shleng by arith sh right shleng */
3276
	       /* replace div by 2^shleng by arith sh right shleng */
3269
              int   shleng;
3277
              int   shleng;
3270
              int   rr;
3278
              int   rr;
3271
              for (shleng = 0; m != 1; shleng++)
3279
              for (shleng = 0; m != 1; shleng++)
3272
                m >>= 1;
3280
                m >>= 1;
3273
 
3281
 
3274
              rr = regfrmdest(&dest, sp);
3282
              rr = regfrmdest(&dest, sp);
3275
              rri_ins ( i_sra, rr, r, shleng);
3283
              rri_ins(i_sra, rr, r, shleng);
3276
              setregalt (aa, rr);
3284
              setregalt(aa, rr);
3277
              mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
3285
              mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
3278
              return mka;
3286
              return mka;
3279
          }
3287
          }
3280
	}
3288
	}
3281
 
3289
 
3282
	r1 = reg_operand(lop, sp);
3290
	r1 = reg_operand(lop, sp);
Line 3285... Line 3293...
3285
	nsp = guardreg(r2, sp);
3293
	nsp = guardreg(r2, sp);
3286
 
3294
 
3287
 
3295
 
3288
	if (!optop(e)|| (errhandle(e)&3)==2) { /* test for (-inf)/-1 and /0 */
3296
	if (!optop(e)|| (errhandle(e)&3)==2) { /* test for (-inf)/-1 and /0 */
3289
	   long over = new_label();
3297
	   long over = new_label();
3290
           trap = ((errhandle(e)&3)==2)?new_label():trap_label(e);
3298
           trap = ((errhandle(e) &3) ==2)?new_label():trap_label(e);
3291
	   condri_ins(i_beq, r2, 0, trap);
3299
	   condri_ins(i_beq, r2, 0, trap);
3292
           condri_ins(i_bne, r2, -1, over);
3300
           condri_ins(i_bne, r2, -1, over);
3293
           condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3301
           condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3294
           set_label(over);
3302
           set_label(over);
3295
	}
3303
	}
Line 3301... Line 3309...
3301
	condri_ins(i_beq, treg, 0, lab);
3309
	condri_ins(i_beq, treg, 0, lab);
3302
	rrr_ins(i_xor, treg, treg, r2);
3310
	rrr_ins(i_xor, treg, treg, r2);
3303
	rri_ins(i_sra, treg, treg, 31);
3311
	rri_ins(i_sra, treg, treg, 31);
3304
	rrr_ins(i_addu, r0, r0, treg);
3312
	rrr_ins(i_addu, r0, r0, treg);
3305
	set_label(lab);
3313
	set_label(lab);
3306
	if ((errhandle(e)&3)==2) set_label(trap);
3314
	if ((errhandle(e) &3) ==2)set_label(trap);
3307
	setregalt(aa, r0);
3315
	setregalt(aa, r0);
3308
	mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
3316
	mka.regmove = move(aa, dest, guardreg(r0,sp), 0);
3309
	return mka;
3317
	return mka;
3310
    }
3318
    }
3311
 
3319
 
Line 3319... Line 3327...
3319
	condri_ins(i_bge,r, 0, l);
3327
	condri_ins(i_bge,r, 0, l);
3320
	rri_ins(i_addu, d, r, 0);
3328
	rri_ins(i_addu, d, r, 0);
3321
	rrr_ins(i_subu, d, 0, r);
3329
	rrr_ins(i_subu, d, 0, r);
3322
	setreorder();
3330
	setreorder();
3323
	if (!optop(e)) {
3331
	if (!optop(e)) {
3324
		condri_ins (i_ble, r, maxmin(sh(e)).mini, trap_label(e));
3332
		condri_ins(i_ble, r, maxmin(sh(e)).mini, trap_label(e));
3325
	}
3333
	}
3326
        set_label_no_clear(l);
3334
        set_label_no_clear(l);
3327
	setregalt(aa, d);
3335
	setregalt(aa, d);
3328
	mka.regmove = move(aa, dest, guardreg(d, sp), 0);
3336
	mka.regmove = move(aa, dest, guardreg(d, sp), 0);
3329
	return mka;
3337
	return mka;
3330
    }
3338
    }
3331
    case neg_tag: case offset_negate_tag:
3339
    case neg_tag: case offset_negate_tag:
3332
      {
3340
      {
3333
	if (optop(e) ) {
3341
	if (optop(e)) {
3334
          mka.regmove = monop (e, sp, dest, i_negu);
3342
          mka.regmove = monop(e, sp, dest, i_negu);
3335
          return mka;
3343
          return mka;
3336
        }
3344
        }
3337
        if ((errhandle(e)&3)==3 && shape_size(sh(e)) == 32) {
3345
        if ((errhandle(e) &3) ==3 && shape_size(sh(e)) == 32) {
3338
          mka.regmove = monop (e, sp, dest, i_neg);
3346
          mka.regmove = monop(e, sp, dest, i_neg);
3339
          return mka;
3347
          return mka;
3340
        }
3348
        }
3341
        else {
3349
        else {
3342
          int r1 = reg_operand(son(e), sp);
3350
          int r1 = reg_operand(son(e), sp);
3343
          long trap = trap_label(e);
3351
          long trap = trap_label(e);
Line 3347... Line 3355...
3347
          r2 = getreg(sp.fixed);
3355
          r2 = getreg(sp.fixed);
3348
          mon_ins(i_neg, r2, r1);
3356
          mon_ins(i_neg, r2, r1);
3349
	  if (is_signed(sh(e)))condri_ins(i_ble, r2, maxmin(sh(e)).mini, trap);
3357
	  if (is_signed(sh(e)))condri_ins(i_ble, r2, maxmin(sh(e)).mini, trap);
3350
	  setregalt(aa, r2);
3358
	  setregalt(aa, r2);
3351
	  mka.regmove = move(aa, dest, guardreg(r2, sp), 0);
3359
	  mka.regmove = move(aa, dest, guardreg(r2, sp), 0);
3352
	  return mka;
3360
	  return mka;
3353
	}
3361
	}
3354
 
3362
 
3355
 
3363
 
3356
      }				/* end neg */
3364
      }				/* end neg */
3357
 
3365
 
3358
 
3366
 
3359
 
3367
 
Line 3367... Line 3375...
3367
 
3375
 
3368
 
3376
 
3369
    case shl_tag:
3377
    case shl_tag:
3370
    case shr_tag:
3378
    case shr_tag:
3371
      {
3379
      {
3372
	exp s = son (e);
3380
	exp s = son(e);
3373
	exp b = bro (s);
3381
	exp b = bro(s);
3374
	int   a;
3382
	int   a;
3375
	int   d;
3383
	int   d;
3376
	int sz = shape_size(sh(s));
3384
	int sz = shape_size(sh(s));
3377
        bool lded = ((name (s) == name_tag && regofval (s) >= 100)
3385
        bool lded = ((name(s) == name_tag && regofval(s) >= 100)
3378
	      		|| (name (s) == cont_tag &&
3386
	      		|| (name(s) == cont_tag &&
3379
		    (name (son (s)) != name_tag || regofval (son (s)) > 0)
3387
		   (name(son(s))!= name_tag || regofval(son(s)) > 0)
3380
	      		    )
3388
	      		   )
3381
		    );
3389
		   );
3382
        bool signok = (sz == 32 || name(s)== chvar_tag || lded );
3390
        bool signok = (sz == 32 || name(s) == chvar_tag || lded);
3383
	ans aa;
3391
	ans aa;
3384
	space nsp;
3392
	space nsp;
3385
	bool sgned = is_signed(sh (e));
3393
	bool sgned = is_signed(sh(e));
3386
	char *shnat;
3394
	char *shnat;
3387
	char *shun;
3395
	char *shun;
3388
	int norms = 0;
3396
	int norms = 0;
3389
	if (lded && name (b) == val_tag && (no (b) == 16 || no (b) == 24)
3397
	if (lded && name(b) == val_tag && (no(b) == 16 || no(b) == 24)
3390
	    && name (e) == shr_tag  ) {
3398
	    && name(e) == shr_tag ) {
3391
		/* can use short loads instead of shifts */
3399
		/* can use short loads instead of shifts */
3392
	  where w;
3400
	  where w;
3393
	  instore is;
3401
	  instore is;
3394
	  w = locate (s, sp, sh (s), 0);
3402
	  w = locate(s, sp, sh(s), 0);
3395
	  /* 'address' of  first operand with shape of result */
3403
	  /* 'address' of  first operand with shape of result */
3396
 
3404
 
3397
	  switch (w.answhere.discrim) {
3405
	  switch (w.answhere.discrim) {
3398
	      /* if w is a register we still have to do shifts */
3406
	      /* if w is a register we still have to do shifts */
3399
	    case inreg: {
3407
	    case inreg: {
3400
		a = regalt (w.answhere);
3408
		a = regalt(w.answhere);
3401
		goto alreadythere;
3409
		goto alreadythere;
3402
	      }
3410
	      }
3403
	    case notinreg:
3411
	    case notinreg:
3404
	      {
3412
	      {
3405
		is = insalt (w.answhere);
3413
		is = insalt(w.answhere);
3406
		if (!is.adval)
3414
		if (!is.adval)
3407
		  break;
3415
		  break;
3408
		if (is.b.offset == 0 && (a = is.b.base) >= 0 && a <= 31) {
3416
		if (is.b.offset == 0 && (a = is.b.base) >= 0 && a <= 31) {
3409
		  goto alreadythere;
3417
		  goto alreadythere;
3410
		}
3418
		}
Line 3421... Line 3429...
3421
	  }
3429
	  }
3422
 
3430
 
3423
	  d = regfrmdest(&dest,sp);
3431
	  d = regfrmdest(&dest,sp);
3424
 
3432
 
3425
	  /* d is destination register */
3433
	  /* d is destination register */
3426
	  if (!BIGEND) {
3434
	  if (!BIGEND) {
3427
            if (no (b) == 16) {
3435
            if (no(b) == 16) {
3428
              is.b.offset += 2;
3436
              is.b.offset += 2;
3429
            }
3437
            }
3430
            else {
3438
            else {
3431
              is.b.offset += 3;
3439
              is.b.offset += 3;
3432
            }
3440
            }
3433
          }
3441
          }
3434
	  ls_ins ((no (b) == 16) ? ((sgned) ? i_lh : i_lhu) : ((sgned) ? i_lb : i_lbu),
3442
	  ls_ins((no(b) == 16)?((sgned)? i_lh : i_lhu):((sgned)? i_lb : i_lbu),
3435
	      d, is.b);
3443
	      d, is.b);
3436
	  setregalt (aa, d);
3444
	  setregalt(aa, d);
3437
	  move (aa, dest, guardreg (d, sp), 0);
3445
	  move(aa, dest, guardreg(d, sp), 0);
3438
	  mka.regmove = d;
3446
	  mka.regmove = d;
3439
	  return mka;
3447
	  return mka;
3440
 
3448
 
3441
	}
3449
	}
3442
 
3450
 
3443
	a = reg_operand (s, sp);
3451
	a = reg_operand(s, sp);
3444
    alreadythere:
3452
    alreadythere:
3445
	/* choose which shift instruction */
3453
	/* choose which shift instruction */
3446
	if (name (e) == shr_tag) {
3454
	if (name(e) == shr_tag) {
3447
	  shnat = (sgned) ? i_sra : i_srl;
3455
	  shnat = (sgned)? i_sra : i_srl;
3448
	  shun = i_sll;
3456
	  shun = i_sll;
3449
	  if (!signok) {
3457
	  if (!signok) {
3450
		rri_ins(i_sll, a, a, norms = 32-sz);
3458
		rri_ins(i_sll, a, a, norms = 32-sz);
3451
	  }
3459
	  }
3452
	}
3460
	}
3453
	else {
3461
	else {
3454
	  shnat = i_sll;
3462
	  shnat = i_sll;
3455
	  shun = (sgned) ? i_sra : i_srl;
3463
	  shun = (sgned)? i_sra : i_srl;
3456
	}
3464
	}
3457
 
3465
 
3458
 
3466
 
3459
	nsp = guardreg (a, sp);
3467
	nsp = guardreg(a, sp);
3460
	d = regfrmdest(&dest, nsp);
3468
	d = regfrmdest(&dest, nsp);
3461
 
3469
 
3462
 
3470
 
3463
	if (name (b) == val_tag) {
3471
	if (name(b) == val_tag) {
3464
	  /* if its a constant shift we dont have to choose shift
3472
	  /* if its a constant shift we dont have to choose shift
3465
	     dynamically ... */
3473
	     dynamically ... */
3466
	  if (no (b) >= 0) {
3474
	  if (no(b) >= 0) {
3467
	    rri_ins (shnat, d, a, no (b)+norms);
3475
	    rri_ins(shnat, d, a, no(b) +norms);
3468
	  }
3476
	  }
3469
	  else {
3477
	  else {
3470
	    rri_ins (shun, d, a, -no (b));
3478
	    rri_ins(shun, d, a, -no(b));
3471
	  }
3479
	  }
3472
	}
3480
	}
3473
	else {
3481
	else {
3474
	  int   sr = getreg (nsp.fixed);
3482
	  int   sr = getreg(nsp.fixed);
3475
	  int   ar = reg_operand (b, nsp);
3483
	  int   ar = reg_operand(b, nsp);
3476
	  if (norms != 0) {
3484
	  if (norms != 0) {
3477
		rri_ins(shnat, a, a, norms);
3485
		rri_ins(shnat, a, a, norms);
3478
	  }
3486
	  }
3479
	  if (NONEGSHIFTS || !is_signed(sh(e))
3487
	  if (NONEGSHIFTS || !is_signed(sh(e))
3480
	      || (name (b) == and_tag && name (bro (son (b))) == val_tag
3488
	      || (name(b) == and_tag && name(bro(son(b))) == val_tag
3481
		&& no (bro (son (b))) > 0 && no (bro (son (b))) <= 31)
3489
		&& no(bro(son(b))) > 0 && no(bro(son(b))) <= 31)
3482
	    ) {			/* ... similarly in these cases */
3490
	    ) {			/* ... similarly in these cases */
3483
	    rrr_ins (shnat, d, a, ar);
3491
	    rrr_ins(shnat, d, a, ar);
3484
	  }
3492
	  }
3485
	  else {		/* choose shift dynamically - is this
3493
	  else {		/* choose shift dynamically - is this
3486
				   necessary for C? */
3494
				   necessary for C? */
3487
	    int   l = new_label ();
3495
	    int   l = new_label();
3488
	    int   endl = new_label ();
3496
	    int   endl = new_label();
3489
	    condri_ins (i_bge, ar, 0, l);
3497
	    condri_ins(i_bge, ar, 0, l);
3490
	    mon_ins (i_neg, sr, ar);
3498
	    mon_ins(i_neg, sr, ar);
3491
	    rrr_ins (shun, d, a, sr);
3499
	    rrr_ins(shun, d, a, sr);
3492
	    uncond_ins (i_b, endl);
3500
	    uncond_ins(i_b, endl);
3493
	    set_label (l);
3501
	    set_label(l);
3494
	    rrr_ins (shnat, d, a, ar);
3502
	    rrr_ins(shnat, d, a, ar);
3495
	    set_label (endl);
3503
	    set_label(endl);
3496
	  }
3504
	  }
3497
	}
3505
	}
3498
	setregalt (aa, d);
3506
	setregalt(aa, d);
3499
	move (aa, dest, nsp, 1);
3507
	move(aa, dest, nsp, 1);
3500
	mka.regmove = d;
3508
	mka.regmove = d;
3501
	return mka;
3509
	return mka;
3502
      }				/* end shl */
3510
      }				/* end shl */
3503
 
3511
 
3504
 
3512
 
3505
 
3513
 
3506
    case mod_tag:
3514
    case mod_tag:
3507
      {  /* only applies to signed operands */
3515
      {  /* only applies to signed operands */
3508
	exp rop = bro (son (e));
3516
	exp rop = bro(son(e));
3509
	exp lop = son(e);
3517
	exp lop = son(e);
3510
	space nsp;
3518
	space nsp;
3511
	int r0, r1, r2;
3519
	int r0, r1, r2;
3512
	int lab, treg;
3520
	int lab, treg;
3513
	ans aa;
3521
	ans aa;
3514
	if (name (rop) == val_tag) {/* mod by constant */
3522
	if (name (rop) == val_tag) {/* mod by constant */
3515
	  int   m = no (rop);
3523
	  int   m = no(rop);
3516
	  if (m > 1 && (m & (m - 1)) == 0) {
3524
	  if (m > 1 && (m & (m - 1)) == 0) {
3517
	    /* mod by power of 2 replaced by and */
3525
	    /* mod by power of 2 replaced by and */
3518
	    int   r = reg_operand (son (e), sp);
3526
	    int   r = reg_operand(son(e), sp);
3519
	    ans aa;
3527
	    ans aa;
3520
	    int   rr = regfrmdest(&dest,sp);
3528
	    int   rr = regfrmdest(&dest,sp);
3521
	    rri_ins (i_and, rr, r, no (rop) - 1);
3529
	    rri_ins(i_and, rr, r, no(rop) - 1);
3522
	    setregalt (aa, rr);
3530
	    setregalt(aa, rr);
3523
	    mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
3531
	    mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
3524
	    return mka;
3532
	    return mka;
3525
	  }
3533
	  }
3526
	}
3534
	}
3527
 
3535
 
3528
	r1 = reg_operand(lop, sp);
3536
	r1 = reg_operand(lop, sp);
3529
	nsp = guardreg(r1, sp);
3537
	nsp = guardreg(r1, sp);
3530
	r2 = reg_operand(rop, nsp);
3538
	r2 = reg_operand(rop, nsp);
3531
 
3539
 
3532
	if (!optop(e)) { /* test for (-inf)/-1 and /0 */
3540
	if (!optop(e)) { /* test for (-inf)/-1 and /0 */
3533
	   long over = new_label();
3541
	   long over = new_label();
3534
           long trap = trap_label(e);
3542
           long trap = trap_label(e);
3535
	   condri_ins(i_beq, r2, 0, trap);
3543
	   condri_ins(i_beq, r2, 0, trap);
3536
           condri_ins(i_bne, r2, -1, over);
3544
           condri_ins(i_bne, r2, -1, over);
Line 3551... Line 3559...
3551
	return mka;
3559
	return mka;
3552
    }
3560
    }
3553
 
3561
 
3554
    case rem2_tag: case rem0_tag:
3562
    case rem2_tag: case rem0_tag:
3555
      {
3563
      {
3556
	exp rop = bro (son (e));
3564
	exp rop = bro(son(e));
3557
	exp lop = son(e);
3565
	exp lop = son(e);
3558
	bool uns = !is_signed(sh (e));
3566
	bool uns = !is_signed(sh(e));
3559
	space nsp;
3567
	space nsp;
3560
	int r0, r1, r2;
3568
	int r0, r1, r2;
3561
	ans aa;
3569
	ans aa;
3562
	if ((uns || name(e)==rem0_tag) && name (rop) == val_tag) {
3570
	if ((uns || name(e) ==rem0_tag) && name(rop) == val_tag) {
3563
		/* mod by constant */
3571
		/* mod by constant */
3564
	  int   m = no (rop);
3572
	  int   m = no(rop);
3565
	  if (m > 1 && (m & (m - 1)) == 0) {
3573
	  if (m > 1 && (m & (m - 1)) == 0) {
3566
	    /* mod by power of 2 replaced by and */
3574
	    /* mod by power of 2 replaced by and */
3567
	    int   r = reg_operand (son (e), sp);
3575
	    int   r = reg_operand(son(e), sp);
3568
	    ans aa;
3576
	    ans aa;
3569
	    int   rr = regfrmdest(&dest,sp);
3577
	    int   rr = regfrmdest(&dest,sp);
3570
	    rri_ins (i_and, rr, r, no (rop) - 1);
3578
	    rri_ins(i_and, rr, r, no(rop) - 1);
3571
	    setregalt (aa, rr);
3579
	    setregalt(aa, rr);
3572
	    mka.regmove = move (aa, dest, guardreg (rr, sp), 1);
3580
	    mka.regmove = move(aa, dest, guardreg(rr, sp), 1);
3573
	    return mka;
3581
	    return mka;
3574
	  }
3582
	  }
3575
	  if( m != 0 && (m!=-1 || uns)) {
3583
	  if (m != 0 && (m!=-1 || uns)) {
3576
	  	r1 = reg_operand(lop, sp);
3584
	  	r1 = reg_operand(lop, sp);
3577
	  	r0 = regfrmdest(&dest, sp);
3585
	  	r0 = regfrmdest(&dest, sp);
3578
		rri_ins((uns)?i_remu:i_rem, r0, r1, m);
3586
		rri_ins((uns)?i_remu:i_rem, r0, r1, m);
3579
		setregalt(aa, r0);
3587
		setregalt(aa, r0);
3580
		mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
3588
		mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
3581
		return mka;
3589
		return mka;
3582
	  }
3590
	  }
3583
	}
3591
	}
3584
 
3592
 
3585
	r1 = reg_operand(lop, sp);
3593
	r1 = reg_operand(lop, sp);
3586
	nsp = guardreg(r1, sp);
3594
	nsp = guardreg(r1, sp);
3587
	r2 = reg_operand(rop, nsp);
3595
	r2 = reg_operand(rop, nsp);
3588
 
3596
 
3589
	if (!optop(e)) { /* test for (-inf)/-1 and /0 */
3597
	if (!optop(e)) { /* test for (-inf)/-1 and /0 */
Line 3594... Line 3602...
3594
             condri_ins(i_bne, r2, -1, over);
3602
             condri_ins(i_bne, r2, -1, over);
3595
             condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3603
             condri_ins(i_beq, r1, maxmin(sh(e)).mini, trap);
3596
             set_label(over);
3604
             set_label(over);
3597
           }
3605
           }
3598
	}
3606
	}
3599
 
3607
 
3600
	r0 = regfrmdest(&dest, sp);
3608
	r0 = regfrmdest(&dest, sp);
3601
	rrr_ins((uns)?i_remu:i_rem, r0, r1, r2);
3609
	rrr_ins((uns)?i_remu:i_rem, r0, r1, r2);
3602
	setregalt(aa, r0);
3610
	setregalt(aa, r0);
3603
	mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
3611
	mka.regmove = move(aa, dest, guardreg(r0,nsp), 0);
3604
	return mka;
3612
	return mka;
3605
 
3613
 
3606
      }				/* end mod */
3614
      }				/* end mod */
3607
 
3615
 
3608
 
3616
 
3609
    case minptr_tag: case make_stack_limit_tag:
3617
    case minptr_tag: case make_stack_limit_tag:
3610
      {
3618
      {
3611
	mka.regmove = non_comm_op (e, sp, dest, i_subu);
3619
	mka.regmove = non_comm_op(e, sp, dest, i_subu);
3612
	return mka;
3620
	return mka;
3613
      }
3621
      }
3614
 
3622
 
3615
    case fplus_tag:
3623
    case fplus_tag:
3616
      {
3624
      {
3617
	mka.regmove =
3625
	mka.regmove =
3618
	  fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_add_d : i_add_s);
3626
	  fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_add_d : i_add_s);
3619
	if (!optop(e)) checknan(e, sp);
3627
	if (!optop(e))checknan(e, sp);
3620
	return mka;
3628
	return mka;
3621
      }
3629
      }
3622
 
3630
 
3623
    case fminus_tag:
3631
    case fminus_tag:
3624
      {
3632
      {
3625
	mka.regmove =
3633
	mka.regmove =
3626
	  fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_sub_d : i_sub_s);
3634
	  fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_sub_d : i_sub_s);
3627
	if (!optop(e)) checknan(e, sp);
3635
	if (!optop(e))checknan(e, sp);
3628
	return mka;
3636
	return mka;
3629
      }
3637
      }
3630
 
3638
 
3631
    case fmult_tag:
3639
    case fmult_tag:
3632
      {
3640
      {
3633
	mka.regmove =
3641
	mka.regmove =
3634
	  fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_mul_d : i_mul_s);
3642
	  fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_mul_d : i_mul_s);
3635
	if (!optop(e)) checknan(e, sp);
3643
	if (!optop(e))checknan(e, sp);
3636
	return mka;
3644
	return mka;
3637
      }
3645
      }
3638
 
3646
 
3639
    case fdiv_tag:
3647
    case fdiv_tag:
3640
      {
3648
      {
3641
	mka.regmove =
3649
	mka.regmove =
3642
	  fop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_div_d : i_div_s);
3650
	  fop(e, sp, dest,(name(sh(e))!= shrealhd)? i_div_d : i_div_s);
3643
	if (!optop(e)) checknan(e, sp);
3651
	if (!optop(e))checknan(e, sp);
3644
	return mka;
3652
	return mka;
3645
      }
3653
      }
3646
 
3654
 
3647
    case fneg_tag:
3655
    case fneg_tag:
3648
      {
3656
      {
3649
	mka.regmove =
3657
	mka.regmove =
3650
	  fmop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_neg_d : i_neg_s);
3658
	  fmop(e, sp, dest,(name(sh(e))!= shrealhd)? i_neg_d : i_neg_s);
3651
	if (!optop(e)) checknan(e, sp);
3659
	if (!optop(e))checknan(e, sp);
3652
	return mka;
3660
	return mka;
3653
      }
3661
      }
3654
 
3662
 
3655
    case fabs_tag:
3663
    case fabs_tag:
3656
      {
3664
      {
3657
	mka.regmove =
3665
	mka.regmove =
3658
	  fmop (e, sp, dest, (name (sh (e)) != shrealhd) ? i_abs_d : i_abs_s);
3666
	  fmop(e, sp, dest,(name(sh(e))!= shrealhd)? i_abs_d : i_abs_s);
3659
	if (!optop(e)) checknan(e, sp);
3667
	if (!optop(e))checknan(e, sp);
3660
	return mka;
3668
	return mka;
3661
      }
3669
      }
3662
 
3670
 
3663
    case float_tag:
3671
    case float_tag:
3664
      {
3672
      {
3665
	exp in = son (e);
3673
	exp in = son(e);
3666
	where w;
3674
	where w;
3667
	int r;
3675
	int r;
3668
	int   f
3676
	int   f
3669
	=     (dest.answhere.discrim == infreg) ? regalt (dest.answhere)
3677
	=    (dest.answhere.discrim == infreg)? regalt(dest.answhere)
3670
				/* cheat */
3678
				/* cheat */
3671
	:     getfreg (sp.flt);
3679
	:     getfreg(sp.flt);
3672
	freg frg;
3680
	freg frg;
3673
	ans aa;
3681
	ans aa;
3674
	ash ain;
3682
	ash ain;
3675
	ain = ashof (sh (in));
3683
	ain = ashof(sh(in));
3676
	frg.fr = f;
3684
	frg.fr = f;
3677
	frg.dble = 0;
3685
	frg.dble = 0;
3678
	if (ain.ashsize == 32 && name(sh(in)) != ulonghd) {
3686
	if (ain.ashsize == 32 && name(sh(in))!= ulonghd) {
3679
	  setfregalt (w.answhere, frg);
3687
	  setfregalt(w.answhere, frg);
3680
	  w.ashwhere = ashof (sh (in));
3688
	  w.ashwhere = ashof(sh(in));
3681
	  code_here (in, sp, w);
3689
	  code_here(in, sp, w);
3682
	  /* evaluate fix pt arguement into float pt reg f */
3690
	  /* evaluate fix pt arguement into float pt reg f */
3683
	}
3691
	}
3684
	else {			/* bytes and halfs must go through fixpt
3692
	else {			/* bytes and halfs must go through fixpt
3685
				   regs */
3693
				   regs */
3686
	  r = reg_operand (in, sp);
3694
	  r = reg_operand(in, sp);
3687
	  cop_ins (i_mtc1, r, f << 1);
3695
	  cop_ins(i_mtc1, r, f << 1);
3688
	}
3696
	}
3689
 
3697
 
3690
	rrfp_ins ((name (sh (e)) != shrealhd) ? i_cvt_d_w : i_cvt_s_w,
3698
	rrfp_ins((name(sh(e))!= shrealhd)? i_cvt_d_w : i_cvt_s_w,
3691
	    f << 1, f << 1);
3699
	    f << 1, f << 1);
3692
	if (name (sh (e)) != shrealhd) {
3700
	if (name(sh(e))!= shrealhd) {
3693
	  frg.dble = 1;
3701
	  frg.dble = 1;
3694
	}
3702
	}
3695
 
3703
 
3696
	if( name(sh(in))==ulonghd) {
3704
	if (name(sh(in)) ==ulonghd) {
3697
	     int tmp = getreg(sp.fixed);
3705
	     int tmp = getreg(sp.fixed);
3698
	     int constf = getfreg(guardfreg(f,sp).flt);
3706
	     int constf = getfreg(guardfreg(f,sp).flt);
3699
	     rri_ins(i_and, tmp,r, 0x80000000);
3707
	     rri_ins(i_and, tmp,r, 0x80000000);
3700
	     cop_ins (i_mtc1, tmp, constf << 1);
3708
	     cop_ins(i_mtc1, tmp, constf << 1);
3701
	     rrfp_ins ((frg.dble) ? i_cvt_d_w : i_cvt_s_w,
3709
	     rrfp_ins((frg.dble)? i_cvt_d_w : i_cvt_s_w,
3702
	     		constf << 1, constf << 1);
3710
	     		constf << 1, constf << 1);
3703
	     rrrfp_ins((frg.dble) ? i_sub_d: i_sub_s, f<<1, f<<1, constf<<1);
3711
	     rrrfp_ins((frg.dble)? i_sub_d: i_sub_s, f<<1, f<<1, constf<<1);
3704
	     rrrfp_ins((frg.dble) ? i_sub_d: i_sub_s, f<<1, f<<1, constf<<1);
3712
	     rrrfp_ins((frg.dble)? i_sub_d: i_sub_s, f<<1, f<<1, constf<<1);
3705
	}
3713
	}
3706
	setfregalt (aa, frg);
3714
	setfregalt(aa, frg);
3707
	move (aa, dest, sp, 1);
3715
	move(aa, dest, sp, 1);
3708
	mka.regmove = (frg.dble) ? -(f + 32) : (f + 32);
3716
	mka.regmove = (frg.dble)? - (f + 32):(f + 32);
3709
	return mka;
3717
	return mka;
3710
      }
3718
      }
3711
    case chfl_tag:
3719
    case chfl_tag:
3712
      {
3720
      {
3713
	int   to = name (sh (e));
3721
	int   to = name(sh(e));
3714
	int   from = name (sh (son (e)));
3722
	int   from = name(sh(son(e)));
3715
	bool dto = (to != shrealhd) ? 1 : 0;
3723
	bool dto = (to != shrealhd)? 1 : 0;
3716
	bool dfrom = (from != shrealhd) ? 1 : 0;
3724
	bool dfrom = (from != shrealhd)? 1 : 0;
3717
	if (dto == dfrom) {	/* no change in representation */
3725
	if (dto == dfrom) {	/* no change in representation */
3718
	  return make_code (son (e), sp, dest, exitlab);
3726
	  return make_code(son(e), sp, dest, exitlab);
3719
	}
3727
	}
3720
	else {
3728
	else {
3721
	  freg frg;
3729
	  freg frg;
3722
	  ans aa;
3730
	  ans aa;
3723
	  where w;
3731
	  where w;
3724
	  if (dest.answhere.discrim == infreg) {
3732
	  if (dest.answhere.discrim == infreg) {
3725
	    frg = fregalt (dest.answhere);
3733
	    frg = fregalt(dest.answhere);
3726
	  }
3734
	  }
3727
	  else {
3735
	  else {
3728
	    frg.fr = getfreg (sp.flt);
3736
	    frg.fr = getfreg(sp.flt);
3729
	  }
3737
	  }
3730
	  frg.dble = dfrom;
3738
	  frg.dble = dfrom;
3731
	  setfregalt (aa, frg);
3739
	  setfregalt(aa, frg);
3732
	  w.answhere = aa;
3740
	  w.answhere = aa;
3733
	  w.ashwhere = ashof (sh (son (e)));
3741
	  w.ashwhere = ashof(sh(son(e)));
3734
	  code_here (son (e), sp, w);
3742
	  code_here(son(e), sp, w);
3735
	  if (!optop(e) && !dto) setnoreorder();
3743
	  if (!optop(e) && !dto)setnoreorder();
3736
	  rrfp_ins ((dfrom) ? i_cvt_s_d : i_cvt_d_s, frg.fr << 1, frg.fr << 1);
3744
	  rrfp_ins((dfrom)? i_cvt_s_d : i_cvt_d_s, frg.fr << 1, frg.fr << 1);
3737
	  frg.dble = dto;
3745
	  frg.dble = dto;
3738
	  setfregalt (aa, frg);
3746
	  setfregalt(aa, frg);
3739
	  move (aa, dest, sp, 1);
3747
	  move(aa, dest, sp, 1);
3740
	  mka.regmove = (frg.dble) ? -(frg.fr + 32) : (frg.fr + 32);
3748
	  mka.regmove = (frg.dble)? - (frg.fr + 32):(frg.fr + 32);
3741
	  if (!optop(e) && !dto) {
3749
	  if (!optop(e) && !dto) {
3742
		setreorder();
3750
		setreorder();
3743
		checknan(e, sp);
3751
		checknan(e, sp);
3744
	  }
3752
	  }
3745
	  return mka;
3753
	  return mka;
3746
	}
3754
	}
3747
      }
3755
      }
3748
 
3756
 
3749
    case and_tag:
3757
    case and_tag:
3750
      {
3758
      {
3751
	exp r = son (e);
3759
	exp r = son(e);
3752
	exp l = bro (son (e));
3760
	exp l = bro(son(e));
3753
	ans aa;
3761
	ans aa;
3754
	space nsp;
3762
	space nsp;
3755
	where d1;
3763
	where d1;
3756
	if (last (l) && name (l) == val_tag && (no (l) == 255 || no (l) == 0xffff)
3764
	if (last(l) && name(l) == val_tag && (no(l) == 255 || no(l) == 0xffff)
3757
	    && ((name (r) == name_tag && regofval (r) == 100)
3765
	    && ((name(r) == name_tag && regofval(r) == 100)
3758
	      || (name (r) == cont_tag &&
3766
	      || (name(r) == cont_tag &&
3759
		(name (son (r)) != name_tag
3767
		(name(son(r))!= name_tag
3760
		  || regofval (son (r)) > 0
3768
		  || regofval(son(r)) > 0
3761
		)
3769
		)
3762
	      )
3770
	     )
3763
	    )
3771
	   )
3764
	    && (aa = iskept (r), (aa.discrim == inreg && regalt (aa) == 0))
3772
	    && (aa = iskept(r), (aa.discrim == inreg && regalt(aa) == 0))
3765
	  ) {			/* can use load short instructions */
3773
	  ) {			/* can use load short instructions */
3766
	  where w;
3774
	  where w;
3767
	  int   dsize = dest.ashwhere.ashsize;
3775
	  int   dsize = dest.ashwhere.ashsize;
3768
	  int   asize = (no (l) == 255) ? 8 : 16;
3776
	  int   asize = (no(l) == 255)? 8 : 16;
3769
	  w = locate (r, sp, sh (r), 0);
3777
	  w = locate(r, sp, sh(r), 0);
3770
	  if (w.answhere.discrim == notinreg
3778
	  if (w.answhere.discrim == notinreg
3771
	      && dest.answhere.discrim == notinreg && no (l) == 0xffff) {
3779
	      && dest.answhere.discrim == notinreg && no(l) == 0xffff) {
3772
	    instore isw;
3780
	    instore isw;
3773
	    instore isd;
3781
	    instore isd;
3774
	    isw = insalt (w.answhere);
3782
	    isw = insalt(w.answhere);
3775
	    isd = insalt (dest.answhere);
3783
	    isd = insalt(dest.answhere);
3776
	    if (!isw.adval && isd.adval && isw.b.base == isd.b.base &&
3784
	    if (!isw.adval && isd.adval && isw.b.base == isd.b.base &&
3777
		isd.b.offset == isw.b.offset) {
3785
		isd.b.offset == isw.b.offset) {
3778
	      if (dsize > 16) {
3786
	      if (dsize > 16) {
3779
		if (!BIGEND) isd.b.offset += 2;
3787
		if (!BIGEND)isd.b.offset += 2;
3780
		/* just clear out top bits */
3788
		/* just clear out top bits */
3781
		ls_ins (i_sh, 0, isd.b);
3789
		ls_ins(i_sh, 0, isd.b);
3782
	      }
3790
	      }
3783
	      return mka;
3791
	      return mka;
3784
	    }			/* else drop through to load short case */
3792
	    }			/* else drop through to load short case */
3785
	  }
3793
	  }
3786
	  if (!BIGEND) {
3794
	  if (!BIGEND) {
Line 3793... Line 3801...
3793
	   	 = move (aa, dest, guard(d1,nsp), 0 /* unsigned */ );
3801
	   	 = move (aa, dest, guard(d1,nsp), 0 /* unsigned */ );
3794
 
3802
 
3795
            	return mka;
3803
            	return mka;
3796
	  }
3804
	  }
3797
	}
3805
	}
3798
	mka.regmove = comm_op (e, sp, dest, i_and);
3806
	mka.regmove = comm_op(e, sp, dest, i_and);
3799
	return mka;
3807
	return mka;
3800
      }
3808
      }
3801
    case or_tag:
3809
    case or_tag:
3802
      {
3810
      {
3803
	mka.regmove = comm_op (e, sp, dest, i_or);
3811
	mka.regmove = comm_op(e, sp, dest, i_or);
3804
	return mka;
3812
	return mka;
3805
      }
3813
      }
3806
 
3814
 
3807
    case xor_tag:
3815
    case xor_tag:
3808
      {
3816
      {
3809
	mka.regmove = comm_op (e, sp, dest, i_xor);
3817
	mka.regmove = comm_op(e, sp, dest, i_xor);
3810
	return mka;
3818
	return mka;
3811
      }
3819
      }
3812
 
3820
 
3813
    case not_tag:
3821
    case not_tag:
3814
      {
3822
      {
3815
	if (name(son(e)) == or_tag) {
3823
	if (name(son(e)) == or_tag) {
3816
		mka.regmove = comm_op(son(e), sp, dest, i_nor);
3824
		mka.regmove = comm_op(son(e), sp, dest, i_nor);
3817
	}
3825
	}
3818
	else {
3826
	else {
3819
		mka.regmove = monop (e, sp, dest, i_not);
3827
		mka.regmove = monop(e, sp, dest, i_not);
3820
	}
3828
	}
3821
	return mka;
3829
	return mka;
3822
      }
3830
      }
3823
 
3831
 
3824
 
3832
 
3825
    case offset_pad_tag: {
3833
    case offset_pad_tag: {
3826
	int r, v;
3834
	int r, v;
3827
	ans aa;
3835
	ans aa;
3828
        if (al2(sh(son(e))) >= al2(sh(e))) {
3836
        if (al2(sh(son(e))) >= al2(sh(e))) {
3829
	    if (al2(sh(e)) != 1 || al2(sh(son(e))) == 1) {
3837
	    if (al2(sh(e))!= 1 || al2(sh(son(e))) == 1) {
3830
		/* is already aligned correctly, whether as bit or byte-offset*/
3838
		/* is already aligned correctly, whether as bit or byte-offset*/
3831
		e = son(e); goto tailrecurse;
3839
		e = son(e); goto tailrecurse;
3832
	    }
3840
	    }
3833
  	    r = regfrmdest(&dest, sp);
3841
  	    r = regfrmdest(&dest, sp);
3834
	    v = reg_operand(son(e), sp);
3842
	    v = reg_operand(son(e), sp);
3835
	    rri_ins(i_sll, r, v, 3);
3843
	    rri_ins(i_sll, r, v, 3);
3836
	}
3844
	}
3837
	else {
3845
	else {
3838
		int al = (al2(sh(son(e)))==1)?al2(sh(e)):(al2(sh(e))/8);
3846
		int al = (al2(sh(son(e))) ==1)?al2(sh(e)):(al2(sh(e)) /8);
3839
		r = regfrmdest(&dest, sp);
3847
		r = regfrmdest(&dest, sp);
3840
		v = reg_operand(son(e), sp);
3848
		v = reg_operand(son(e), sp);
3841
		rri_ins(i_addu, r, v, al-1);
3849
		rri_ins(i_addu, r, v, al-1);
3842
		rri_ins(i_and, r, r, -al);
3850
		rri_ins(i_and, r, r, -al);
3843
		if (al2(sh(son(e)))==1) { /* operand is bit-offset,
3851
		if (al2(sh(son(e)))==1) { /* operand is bit-offset,
Line 3872... Line 3880...
3872
      {
3880
      {
3873
	where w;
3881
	where w;
3874
	bool sgned;
3882
	bool sgned;
3875
	ash desper;
3883
	ash desper;
3876
 
3884
 
3877
	int   dr = (dest.answhere.discrim == inreg) ? dest.answhere.val.regans : 0;
3885
	int   dr = (dest.answhere.discrim == inreg)? dest.answhere.val.regans : 0;
3878
	desper = ashof (sh (e));
3886
	desper = ashof(sh(e));
3879
 
3887
 
3880
	if (name (e) == contvol_tag) {
3888
	if (name(e) == contvol_tag) {
3881
	  clear_all ();
3889
	  clear_all();
3882
	  setvolatile ();
3890
	  setvolatile();
3883
	}
3891
	}
3884
	w = locate (e, sp, sh (e), dr);
3892
	w = locate(e, sp, sh(e), dr);
3885
	/* 'address of arguement */
3893
	/* 'address of arguement */
3886
	sgned = ((w.ashwhere.ashsize >= 32) || is_signed(sh (e)) )? 1 : 0;
3894
	sgned = ((w.ashwhere.ashsize >= 32) || is_signed(sh(e)))? 1 : 0;
3887
	mka.regmove = move (w.answhere, dest, (guard (w, sp)), sgned);
3895
	mka.regmove = move(w.answhere, dest,(guard(w, sp)), sgned);
3888
	if (name (e) == contvol_tag) {
3896
	if (name(e) == contvol_tag) {
3889
	  mka.regmove = NOREG;
3897
	  mka.regmove = NOREG;
3890
	  setnovolatile ();
3898
	  setnovolatile();
3891
	}
3899
	}
3892
	return mka;
3900
	return mka;
3893
      }				/* end cont */
3901
      }				/* end cont */
3894
 
3902
 
3895
 
3903
 
3896
    case real_tag: {
3904
    case real_tag: {
3897
	int dble = shape_size(sh(e))>32;
3905
	int dble = shape_size(sh(e)) >32;
3898
	r2l x;
3906
	r2l x;
3899
	int i;
3907
	int i;
3900
	ans aa;
3908
	ans aa;
3901
        instore isa;
3909
        instore isa;
3902
	int n = (nca<16)?nca:16;
3910
	int n = (nca<16)?nca:16;
3903
	x = real2longs_IEEE(&flptnos[no (e)], dble);
3911
	x = real2longs_IEEE(&flptnos[no(e)], dble);
3904
	for(i=0; i< n; i++) {
3912
	for (i=0; i< n; i++) {
3905
	    rcache *r = &rca[i];
3913
	    rcache *r = &rca[i];
3906
	    if (r->dble == dble && r->r.i1 == x.i1 && r-> r.i2 == x.i2)
3914
	    if (r->dble == dble && r->r.i1 == x.i1 && r-> r.i2 == x.i2)
3907
		{isa = r->ad; goto found;}
3915
		{isa = r->ad; goto found;}
3908
	}
3916
	}
3909
	isa = evaluated(e, 0,(dec*)0);
3917
	isa = evaluated(e, 0,(dec*)0);
3910
        rca[nca & 15].dble = dble; rca[nca & 15].r = x; rca[nca & 15].ad = isa;
3918
        rca[nca & 15].dble = dble; rca[nca & 15].r = x; rca[nca & 15].ad = isa;
3911
	nca++;
3919
	nca++;
3912
	settext();
3920
	settext();
3913
  found:setinsalt (aa, isa);
3921
  found:setinsalt(aa, isa);
3914
	mka.regmove = move (aa, dest, sp, 0);
3922
	mka.regmove = move(aa, dest, sp, 0);
3915
	return mka;
3923
	return mka;
3916
    }
3924
    }
3917
    case string_tag:
3925
    case string_tag:
3918
      {
3926
      {
3919
	instore isa;
3927
	instore isa;
3920
	ans aa;
3928
	ans aa;
3921
	bool sgned = ((ashof (sh (e)).ashsize >= 32) || is_signed(sh (e)))? 1 : 0;
3929
	bool sgned = ((ashof(sh(e)).ashsize >= 32) || is_signed(sh(e)))? 1 : 0;
3922
	isa = evaluated (e, 0, (dec*)0);
3930
	isa = evaluated(e, 0,(dec*)0);
3923
	/* place constant in appropriate data segment */
3931
	/* place constant in appropriate data segment */
3924
	settext ();
3932
	settext();
3925
	setinsalt (aa, isa);
3933
	setinsalt(aa, isa);
3926
	mka.regmove = move (aa, dest, sp, sgned);
3934
	mka.regmove = move(aa, dest, sp, sgned);
3927
	return mka;
3935
	return mka;
3928
      }				/* end eval */
3936
      }				/* end eval */
3929
 
3937
 
3930
    case val_tag:
3938
    case val_tag:
3931
      {
3939
      {
3932
	if( shape_size(sh(e))>32) {
3940
	if (shape_size(sh(e)) >32) {
3933
		flt64 temp;
3941
		flt64 temp;
3934
		int ov;
3942
		int ov;
3935
		int r = getreg(sp.fixed);
3943
		int r = getreg(sp.fixed);
3936
		space nsp;
3944
		space nsp;
3937
		baseoff bc;
3945
		baseoff bc;
Line 3939... Line 3947...
3939
		if (dest.answhere.discrim!=notinreg) return mka;
3947
		if (dest.answhere.discrim!=notinreg) return mka;
3940
		if (isbigval(e)) {
3948
		if (isbigval(e)) {
3941
			temp = flt_to_f64(no(e), 0, &ov);
3949
			temp = flt_to_f64(no(e), 0, &ov);
3942
		}
3950
		}
3943
		else {
3951
		else {
3944
			temp.big = (is_signed(sh(e)) && no(e)<0)?-1:0;
3952
			temp.big = (is_signed(sh(e)) && no(e) <0)?-1:0;
3945
			temp.small = no(e);
3953
			temp.small = no(e);
3946
		}
3954
		}
3947
		nsp = guardreg(r, sp);
3955
		nsp = guardreg(r, sp);
3948
		bc.base =0;
3956
		bc.base =0;
3949
		bc.offset = temp.small;
3957
		bc.offset = temp.small;
Line 3956... Line 3964...
3956
		ls_ins(i_li, r, bc);
3964
		ls_ins(i_li, r, bc);
3957
		dest.answhere.val.instoreans.b.offset+=4;
3965
		dest.answhere.val.instoreans.b.offset+=4;
3958
		move(aa,dest,nsp,1);
3966
		move(aa,dest,nsp,1);
3959
		return mka;
3967
		return mka;
3960
	}
3968
	}
3961
	if (no (e) == 0) {
3969
	if (no(e) == 0) {
3962
	  goto null_tag_case;
3970
	  goto null_tag_case;
3963
	}
3971
	}
3964
	else {
3972
	else {
3965
	  ash a;
3973
	  ash a;
3966
	  a = ashof (sh (e));
3974
	  a = ashof(sh(e));
3967
	  if (a.ashsize == 32 || !is_signed(sh (e))) {
3975
	  if (a.ashsize == 32 || !is_signed(sh(e))) {
3968
	    constval = no (e);
3976
	    constval = no(e);
3969
	  }
3977
	  }
3970
	  else
3978
	  else
3971
	    if (a.ashsize == 8) {
3979
	    if (a.ashsize == 8) {
3972
	      constval = no (e) & 255;
3980
	      constval = no(e) & 255;
3973
	      constval -= (constval & 128) << 1;
3981
	      constval -= (constval & 128) << 1;
3974
	    }
3982
	    }
3975
	    else {
3983
	    else {
3976
	      constval = no (e) & 65535;
3984
	      constval = no(e) & 65535;
3977
	      constval -= (constval & 32768) << 1;
3985
	      constval -= (constval & 32768) << 1;
3978
	    }
3986
	    }
3979
	  goto moveconst;
3987
	  goto moveconst;
3980
	}
3988
	}
3981
      }
3989
      }
Line 3992... Line 4000...
3992
    	long old_result_label = result_label;
4000
    	long old_result_label = result_label;
3993
    	exp l;
4001
    	exp l;
3994
    	result_label =0;
4002
    	result_label =0;
3995
    	dump_sregs(fxd, fld);
4003
    	dump_sregs(fxd, fld);
3996
    	if ((fxd &(1<<31))) sp.fixed &= ~(1<<31); /*release link reg */
4004
    	if ((fxd &(1<<31))) sp.fixed &= ~(1<<31); /*release link reg */
3997
    	for(l=son(crt_proc); name(l)==ident_tag && isparam(l); ){
4005
    	for (l=son(crt_proc); name(l) ==ident_tag && isparam(l);) {
3998
    		/* move any pars still in registers which go into dump regs */
4006
    		/* move any pars still in registers which go into dump regs */
3999
    		int sr = props(son(l));
4007
    		int sr = props(son(l));
4000
    		int tr = no(l);
4008
    		int tr = no(l);
4001
    		if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
4009
    		if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
4002
    		    if ((props(l) & infreg_bits)!=0 &&
4010
    		    if ((props(l) & infreg_bits)!=0 &&
4003
    		         (fld &(3<<(sr<<1))) !=0 ) {
4011
    		        (fld & (3<< (sr<<1)))!=0) {
4004
    		       if (name(sh(son(l))) != shrealhd) {
4012
    		       if (name(sh(son(l)))!= shrealhd) {
4005
    		       	  rrfp_ins(i_mov_d, sr<<1, tr<<1);
4013
    		       	  rrfp_ins(i_mov_d, sr<<1, tr<<1);
4006
    		       }
4014
    		       }
4007
    		       else {
4015
    		       else {
4008
   		       	  rrfp_ins(i_mov_s, sr<<1, tr<<1);
4016
   		       	  rrfp_ins(i_mov_s, sr<<1, tr<<1);
4009
    		       }
4017
    		       }
4010
    		       sp.flt &= ~(1<<tr); /* release fpar reg */
4018
    		       sp.flt &= ~(1<<tr); /* release fpar reg */
4011
    		       no(l) = sr; props(son(l)) = tr;
4019
    		       no(l) = sr; props(son(l)) = tr;
4012
    		    }
4020
    		    }
4013
    		    else
4021
    		    else
4014
    		    if ((fxd & (1<<sr)) !=0 ) {
4022
    		    if ((fxd & (1<<sr))!=0) {
4015
    		    	mon_ins(i_move, sr, tr);
4023
    		    	mon_ins(i_move, sr, tr);
4016
    		    	sp.fixed &= ~(1<<tr); /* release par reg */
4024
    		    	sp.fixed &= ~(1<<tr); /* release par reg */
4017
    		    	no(l)=sr; props(son(l)) = tr;
4025
    		    	no(l) =sr; props(son(l)) = tr;
4018
    		    }
4026
    		    }
4019
    		 }
4027
    		 }
4020
    		 l = bro(son(l));
4028
    		 l = bro(son(l));
4021
    		 if (name(l)==dump_tag) l = son(l);
4029
    		 if (name(l) ==dump_tag)l = son(l);
4022
        }
4030
        }
4023
        code_here(son(e), sp, dest);
4031
        code_here(son(e), sp, dest);
4024
    	for(l=son(crt_proc); name(l)==ident_tag && isparam(l); ){
4032
    	for (l=son(crt_proc); name(l) ==ident_tag && isparam(l);) {
4025
    		/* restore structure of moved pars */
4033
    		/* restore structure of moved pars */
4026
    		int sr = props(son(l));
4034
    		int sr = props(son(l));
4027
    		int tr = no(l);
4035
    		int tr = no(l);
4028
    		if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
4036
    		if ((props(l) & inanyreg)!=0 && (tr !=sr) && sr != 0) {
4029
    		    if ((props(l) & infreg_bits)!=0 &&
4037
    		    if ((props(l) & infreg_bits)!=0 &&
4030
    		         (fld &(3<<(tr<<1))) !=0 ) {
4038
    		        (fld & (3<< (tr<<1)))!=0) {
4031
    		       no(l) = sr; props(son(l)) = tr;
4039
    		       no(l) = sr; props(son(l)) = tr;
4032
    		    }
4040
    		    }
4033
    		    else
4041
    		    else
4034
    		    if ((fxd & (1<<tr)) !=0 ) {
4042
    		    if ((fxd & (1<<tr))!=0) {
4035
    		    	no(l)=sr; props(son(l)) = tr;
4043
    		    	no(l) =sr; props(son(l)) = tr;
4036
    		    }
4044
    		    }
4037
    		 }
4045
    		 }
4038
    		 l = bro(son(l));
4046
    		 l = bro(son(l));
4039
    		 if (name(l)==dump_tag) l = son(l);
4047
    		 if (name(l) ==dump_tag)l = son(l);
4040
        }
4048
        }
4041
        if (name(sh(e)) != bothd) {
4049
        if (name(sh(e))!= bothd) {
4042
        	restore_sregs(fxd, fld);
4050
        	restore_sregs(fxd, fld);
4043
        }
4051
        }
4044
        fixdone = old_fixdone;
4052
        fixdone = old_fixdone;
4045
        fltdone = old_fltdone;
4053
        fltdone = old_fltdone;
4046
        result_label = old_result_label;
4054
        result_label = old_result_label;
Line 4091... Line 4099...
4091
	tbd.fixed = fixdump;
4099
	tbd.fixed = fixdump;
4092
	tbd.flt = floatdump;
4100
	tbd.flt = floatdump;
4093
 
4101
 
4094
	pars.fixed = (leaf)?0:(1<<31);
4102
	pars.fixed = (leaf)?0:(1<<31);
4095
	pars.flt = 0;
4103
	pars.flt = 0;
4096
 
4104
 
4097
	for (l = son(e);
4105
	for (l = son(e);
4098
	     name(l) == ident_tag && isparam(l)
4106
	     name(l) == ident_tag && isparam(l)
4099
		&& name(son(l))	!= formal_callee_tag;
4107
		&& name(son(l))	!= formal_callee_tag;
4100
             l = bro(son(l))) {
4108
             l = bro(son(l))) {
4101
		if ((props(l) & infreg_bits)!= 0) {
4109
		if ((props(l) & infreg_bits)!= 0) {
4102
			int n = props(son(l));
4110
			int n = props(son(l));
4103
			if (n != no(l) && n != 0) {
4111
			if (n != no(l) && n != 0) {
4104
				pars.flt |= (3<<(no(l)<<1));
4112
				pars.flt |= (3<< (no(l) <<1));
4105
			}
4113
			}
4106
		}
4114
		}
4107
		else
4115
		else
4108
		if ((props(l) & inreg_bits)!=0) {
4116
		if ((props(l) & inreg_bits)!=0) {
4109
			int n = props(son(l));
4117
			int n = props(son(l));
4110
			if (n != no(l) && n != 0) {
4118
			if (n != no(l) && n != 0) {
Line 4120... Line 4128...
4120
	    out_cpload(current_symno, 25);
4128
	    out_cpload(current_symno, 25);
4121
	    if (as_file) {
4129
	    if (as_file) {
4122
	    	fprintf(as_file, "\t.cpload\t$25\n");
4130
	    	fprintf(as_file, "\t.cpload\t$25\n");
4123
	    }
4131
	    }
4124
	    setreorder();
4132
	    setreorder();
4125
	}
4133
	}
4126
 
4134
 
4127
 
4135
 
4128
	if (name(e)==general_proc_tag) {
4136
	if (name(e) ==general_proc_tag) {
4129
	  if (Has_vcallees) {
4137
	  if (Has_vcallees) {
4130
	  	baseoff b;
4138
	  	baseoff b;
4131
	  	b.base = 30;
4139
	  	b.base = 30;
4132
	  	b.offset = -16;
4140
	  	b.offset = -16;
4133
	  	ls_ins(i_sw, local_reg, b); /* old l-reg in -16(30) */
4141
	  	ls_ins(i_sw, local_reg, b); /* old l-reg in -16(30) */
Line 4136... Line 4144...
4136
			b.offset = -12; /* new l_reg in -12(30); */
4144
			b.offset = -12; /* new l_reg in -12(30); */
4137
			ls_ins(i_sw, local_reg, b);
4145
			ls_ins(i_sw, local_reg, b);
4138
		}
4146
		}
4139
	  }
4147
	  }
4140
	  else
4148
	  else
4141
	  if (Has_fp && name(e)==general_proc_tag) {
4149
	  if (Has_fp && name(e) ==general_proc_tag) {
4142
	 	rri_ins(i_addu, 30, 29, callee_size>>3);
4150
	 	rri_ins(i_addu, 30, 29, callee_size>>3);
4143
	   }
4151
	   }
4144
	  if (frame_size !=0) {
4152
	  if (frame_size !=0) {
4145
		rri_ins (i_subu, 29, 29, frame_size>>3);
4153
		rri_ins(i_subu, 29, 29, frame_size>>3);
4146
	  }
4154
	  }
4147
	}
4155
	}
4148
	else {
4156
	else {
4149
	  if (st !=0) {
4157
	  if (st !=0) {
4150
		rri_ins (i_subu, 29, 29, st);
4158
		rri_ins(i_subu, 29, 29, st);
4151
	  }
4159
	  }
4152
	  if (Has_fp) {
4160
	  if (Has_fp) {
4153
		baseoff b;
4161
		baseoff b;
4154
		b.base = 29;
4162
		b.base = 29;
4155
		b.offset = st-4;
4163
		b.offset = st-4;
4156
		ls_ins(i_sw, 30, b);
4164
		ls_ins(i_sw, 30, b);
4157
		rri_ins(i_addu, 30, 29, st);
4165
		rri_ins(i_addu, 30, 29, st);
4158
	  }
4166
	  }
4159
        }
4167
        }
4160
 
4168
 
4161
	if (Has_tos ) {
4169
	if (Has_tos) {
4162
		baseoff b;
4170
		baseoff b;
4163
		b.base = 30;
4171
		b.base = 30;
4164
		b.offset = -8;
4172
		b.offset = -8;
4165
		ls_ins(i_sw, 29, b);
4173
		ls_ins(i_sw, 29, b);
4166
	}
4174
	}
Line 4184... Line 4192...
4184
		ls_ins(i_lw, 2, b);
4192
		ls_ins(i_lw, 2, b);
4185
		condrr_ins(i_bgt, 2, 29, stackerr_lab);
4193
		condrr_ins(i_bgt, 2, 29, stackerr_lab);
4186
	}
4194
	}
4187
	else stackerr_lab = 0;
4195
	else stackerr_lab = 0;
4188
 
4196
 
4189
	setframe (st);
4197
	setframe(st);
4190
	/* I'm not sure that this is the right order for these -
4198
	/* I'm not sure that this is the right order for these -
4191
	   diagnostics ? */
4199
	   diagnostics ? */
4192
 
4200
 
4193
 
4201
 
4194
	if (fixdump != 0) {
4202
	if (fixdump != 0) {
4195
	  setmask (fixdump, dumpstart - st - 4);
4203
	  setmask(fixdump, dumpstart - st - 4);
4196
	}
4204
	}
4197
	if (floatdump != 0) {
4205
	if (floatdump != 0) {
4198
	  setfmask (floatdump, fldumpstart - st - 4 );
4206
	  setfmask(floatdump, fldumpstart - st - 4);
4199
	}
4207
	}
4200
 
4208
 
4201
 
4209
 
4202
	if ((pprops & realresult_bit) != 0) {
4210
	if ((pprops & realresult_bit)!= 0) {
4203
	      /* proc has real result */
4211
	      /* proc has real result */
4204
	      freg frg;
4212
	      freg frg;
4205
	      frg.fr = 0;
4213
	      frg.fr = 0;
4206
	      frg.dble = (pprops & longrealresult_bit) ? 1 : 0;
4214
	      frg.dble = (pprops & longrealresult_bit)? 1 : 0;
4207
	      setfregalt (procans, frg);
4215
	      setfregalt(procans, frg);
4208
	}
4216
	}
4209
	else
4217
	else
4210
	if ((pprops & has_result_bit) != 0) {
4218
	if ((pprops & has_result_bit)!= 0) {
4211
		/* proc has fixed pt result */
4219
		/* proc has fixed pt result */
4212
		setregalt (procans, 2);
4220
		setregalt(procans, 2);
4213
	}
4221
	}
4214
	else {		/* proc has no result */
4222
	else {		/* proc has no result */
4215
		setregalt (procans, 0);
4223
		setregalt(procans, 0);
4216
	}
4224
	}
4217
 
4225
 
4218
	rscope_level = 0;
4226
	rscope_level = 0;
4219
	result_label = 0;
4227
	result_label = 0;
4220
 
4228
 
4221
        aritherr_lab = 0;
4229
        aritherr_lab = 0;
4222
 
4230
 
4223
	code_here (son(e), guardreg(31,sp), nowhere);
4231
	code_here(son(e), guardreg(31,sp), nowhere);
4224
	/* evaluate body of proc */
4232
	/* evaluate body of proc */
4225
        if (stackerr_lab != 0 || allocaerr_lab != 0) {
4233
        if (stackerr_lab != 0 || allocaerr_lab != 0) {
4226
	   if (stackerr_lab != 0) {
4234
	   if (stackerr_lab != 0) {
4227
		set_label(stackerr_lab);
4235
		set_label(stackerr_lab);
4228
		rri_ins (i_addu, 29, 29, frame_size>>3);
4236
		rri_ins(i_addu, 29, 29, frame_size>>3);
4229
	   }
4237
	   }
4230
	   if (allocaerr_lab != 0) { set_label(allocaerr_lab); }
4238
	   if (allocaerr_lab != 0) { set_label(allocaerr_lab); }
4231
	   do_exception(MIPS_SIGUSR1);
4239
	   do_exception(MIPS_SIGUSR1);
4232
	}
4240
	}
4233
	if (aritherr_lab != 0) {
4241
	if (aritherr_lab != 0) {
4234
		set_label(aritherr_lab);
4242
		set_label(aritherr_lab);
4235
		do_exception(MIPS_SIGFPE);
4243
		do_exception(MIPS_SIGFPE);
4236
	}
4244
	}
4237
	if (diagPIClab != 0) {
4245
	if (diagPIClab != 0) {
4238
		set_label(diagPIClab);
4246
		set_label(diagPIClab);
4239
		uncond_ins (i_j, 31);
4247
		uncond_ins(i_j, 31);
4240
	}
4248
	}
4241
 
4249
 
4242
	return mka;
4250
	return mka;
4243
 
4251
 
4244
      }				/* end proc */
4252
      }				/* end proc */
Line 4248... Line 4256...
4248
    	int r = regfrmdest(&dest, sp);
4256
    	int r = regfrmdest(&dest, sp);
4249
    	ans aa;
4257
    	ans aa;
4250
	if (checkalloc(e)) {
4258
	if (checkalloc(e)) {
4251
	    int tmp = getreg(guardreg(r,sp).fixed);
4259
	    int tmp = getreg(guardreg(r,sp).fixed);
4252
	    exp stl = find_named_tg("__TDFstacklim",
4260
	    exp stl = find_named_tg("__TDFstacklim",
4253
			f_pointer(f_alignment(f_proc)) );
4261
			f_pointer(f_alignment(f_proc)));
4254
	    baseoff b;
4262
	    baseoff b;
4255
	    setvar(stl);
4263
	    setvar(stl);
4256
	    if (name(s)==val_tag) {
4264
	    if (name(s) ==val_tag) {
4257
		    rri_ins(i_subu, r, 29, (no(s)+7 )&~7);
4265
		    rri_ins(i_subu, r, 29,(no(s) +7) &~7);
4258
	    }
4266
	    }
4259
	    else {
4267
	    else {
4260
		    int rr = reg_operand(s, sp);
4268
		    int rr = reg_operand(s, sp);
4261
		    rri_ins(i_addu, tmp, rr, 7 );
4269
		    rri_ins(i_addu, tmp, rr, 7);
4262
		    rri_ins(i_and, tmp,tmp, ~7);
4270
		    rri_ins(i_and, tmp,tmp, ~7);
4263
		    rrr_ins(i_subu, r, 29, tmp);
4271
		    rrr_ins(i_subu, r, 29, tmp);
4264
	    }
4272
	    }
4265
	    b = boff(stl);
4273
	    b = boff(stl);
4266
	    if (allocaerr_lab == 0) allocaerr_lab = new_label();
4274
	    if (allocaerr_lab == 0)allocaerr_lab = new_label();
4267
	    ls_ins(i_lw, tmp, b);
4275
	    ls_ins(i_lw, tmp, b);
4268
	    condrr_ins(i_bgt, tmp, r, allocaerr_lab);
4276
	    condrr_ins(i_bgt, tmp, r, allocaerr_lab);
4269
	    rri_ins(i_addu, 29, r, 0);
4277
	    rri_ins(i_addu, 29, r, 0);
4270
	}
4278
	}
4271
	else {
4279
	else {
4272
	    if (name(s)==val_tag) {
4280
	    if (name(s) ==val_tag) {
4273
		    rri_ins(i_subu, 29, 29, (no(s)+7 )&~7);
4281
		    rri_ins(i_subu, 29, 29,(no(s) +7) &~7);
4274
	    }
4282
	    }
4275
	    else {  int tmp = getreg(sp.fixed);
4283
	    else {  int tmp = getreg(sp.fixed);
4276
		    int rr = reg_operand(s, sp);
4284
		    int rr = reg_operand(s, sp);
4277
		    rri_ins(i_addu, tmp, rr, 7 );
4285
		    rri_ins(i_addu, tmp, rr, 7);
4278
		    rri_ins(i_and, tmp,tmp, ~7);
4286
		    rri_ins(i_and, tmp,tmp, ~7);
4279
		    rrr_ins(i_subu, 29, 29, tmp);
4287
		    rrr_ins(i_subu, 29, 29, tmp);
4280
	    }
4288
	    }
4281
	}
4289
	}
4282
	reset_tos();
4290
	reset_tos();
4283
	rri_ins(i_addu, r, 29, (max_args>>3) );
4291
	rri_ins(i_addu, r, 29,(max_args>>3));
4284
    	setregalt(aa, r);
4292
    	setregalt(aa, r);
4285
    	mka.regmove = move(aa, dest, sp, 1);
4293
    	mka.regmove = move(aa, dest, sp, 1);
4286
    	return mka;
4294
    	return mka;
4287
    }
4295
    }
4288
 
4296
 
4289
    case last_local_tag: {
4297
    case last_local_tag: {
4290
    	int r = regfrmdest(&dest, sp);
4298
    	int r = regfrmdest(&dest, sp);
4291
    	ans aa;
4299
    	ans aa;
4292
    	rri_ins(i_addu, r, 29, max_args>>3);
4300
    	rri_ins(i_addu, r, 29, max_args>>3);
4293
    	setregalt(aa, r);
4301
    	setregalt(aa, r);
4294
    	mka.regmove = move(aa, dest, sp, 1);
4302
    	mka.regmove = move(aa, dest, sp, 1);
4295
    	return mka;
4303
    	return mka;
4296
    }
4304
    }
4297
 
4305
 
4298
    case local_free_tag: {
4306
    case local_free_tag: {
4299
	exp p = son(e);
4307
	exp p = son(e);
4300
    	int r = reg_operand(p, sp);
4308
    	int r = reg_operand(p, sp);
4301
	exp off = bro(p);
4309
	exp off = bro(p);
4302
	if (name(off)==val_tag) {
4310
	if (name(off) ==val_tag) {
4303
		rri_ins(i_addu, r, r,(no(off)+7 )&~7);
4311
		rri_ins(i_addu, r, r,(no(off) +7) &~7);
4304
	}
4312
	}
4305
	else {
4313
	else {
4306
		int tmp = reg_operand(off, guardreg(r, sp));
4314
		int tmp = reg_operand(off, guardreg(r, sp));
4307
		rri_ins(i_addu, tmp, tmp, 7 );
4315
		rri_ins(i_addu, tmp, tmp, 7);
4308
		rri_ins(i_and, tmp,tmp, ~7);
4316
		rri_ins(i_and, tmp,tmp, ~7);
4309
		rrr_ins(i_addu, r, r, tmp);
4317
		rrr_ins(i_addu, r, r, tmp);
4310
	}
4318
	}
4311
 
4319
 
4312
    	if (Has_fp) {
4320
    	if (Has_fp) {
4313
          rri_ins(i_subu, 29, r, max_args>>3);
4321
          rri_ins(i_subu, 29, r, max_args>>3);
4314
          reset_tos();
4322
          reset_tos();
4315
        }
4323
        }
4316
    	return mka;
4324
    	return mka;
4317
    }
4325
    }
4318
 
4326
 
4319
    case local_free_all_tag: {
4327
    case local_free_all_tag: {
4320
    	if (Has_fp) {
4328
    	if (Has_fp) {
4321
          rri_ins(i_subu, 29, 30 , (frame_size+callee_size)>>3);
4329
          rri_ins(i_subu, 29, 30 ,(frame_size+callee_size) >>3);
4322
          reset_tos();
4330
          reset_tos();
4323
        }
4331
        }
4324
    	return mka;
4332
    	return mka;
4325
    }
4333
    }
4326
 
4334
 
Line 4329... Line 4337...
4329
    	ans aa;
4337
    	ans aa;
4330
    	if (Has_fp) {
4338
    	if (Has_fp) {
4331
    		mon_ins(i_move, r, 30);
4339
    		mon_ins(i_move, r, 30);
4332
    	}
4340
    	}
4333
    	else {
4341
    	else {
4334
    		rri_ins(i_addu, r, 29, (frame_size+callee_size)>>3);
4342
    		rri_ins(i_addu, r, 29,(frame_size+callee_size) >>3);
4335
    	}
4343
    	}
4336
    	setregalt(aa, r);
4344
    	setregalt(aa, r);
4337
    	mka.regmove = move(aa, dest, sp, 1);
4345
    	mka.regmove = move(aa, dest, sp, 1);
4338
    	return mka;
4346
    	return mka;
4339
    }
4347
    }
Line 4345... Line 4353...
4345
 
4353
 
4346
    case null_tag:
4354
    case null_tag:
4347
  null_tag_case:
4355
  null_tag_case:
4348
      {
4356
      {
4349
	ans aa;
4357
	ans aa;
4350
	setregalt (aa, 0);
4358
	setregalt(aa, 0);
4351
	mka.regmove = move (aa, dest, sp, 1);
4359
	mka.regmove = move(aa, dest, sp, 1);
4352
	return mka;
4360
	return mka;
4353
      }
4361
      }
4354
 
4362
 
4355
    case round_tag:
4363
    case round_tag:
4356
   /* case trunc_tag: */
4364
   /* case trunc_tag: */
4357
      {
4365
      {
4358
	int   r = (dest.answhere.discrim == inreg) ? regalt (dest.answhere)
4366
	int   r = (dest.answhere.discrim == inreg)? regalt(dest.answhere)
4359
	:     getreg (sp.fixed);
4367
	:     getreg(sp.fixed);
4360
	int   sfr = freg_operand (son (e), sp);
4368
	int   sfr = freg_operand(son(e), sp);
4361
	int   dfr = getfreg (guardfreg (sfr, sp).flt);
4369
	int   dfr = getfreg(guardfreg(sfr, sp).flt);
4362
	ans aa;
4370
	ans aa;
4363
	int   s = shape_size(sh(son(e)));
4371
	int   s = shape_size(sh(son(e)));
4364
	int mr = (round_number(e)== f_to_nearest)? 3:
4372
	int mr = (round_number(e) == f_to_nearest)? 3:
4365
			(round_number(e)== f_toward_zero)? 2:
4373
			(round_number(e) == f_toward_zero)? 2:
4366
			(round_number(e)== f_toward_larger)? 1:
4374
			(round_number(e) == f_toward_larger)? 1:
4367
			(round_number(e)== f_toward_smaller)? 0:3;
4375
			(round_number(e) == f_toward_smaller)? 0:3;
4368
	int r1;
4376
	int r1;
4369
	if (r==0) r = getreg(sp.fixed);
4377
	if (r==0)r = getreg(sp.fixed);
4370
	sp = guardreg(r, sp);
4378
	sp = guardreg(r, sp);
4371
	r1 = getreg(sp.fixed);
4379
	r1 = getreg(sp.fixed);
4372
 	if (!optop(e)) setnoreorder();
4380
 	if (!optop(e))setnoreorder();
4373
 
4381
 
4374
	cop_ins(i_cfc1, r, 31);
4382
	cop_ins(i_cfc1, r, 31);
4375
	rrr_ins(i_or, 0, 0, 0); /* nop */
4383
	rrr_ins(i_or, 0, 0, 0); /* nop */
4376
	rri_ins(i_or, r1, r , 3);
4384
	rri_ins(i_or, r1, r , 3);
4377
	rri_ins(i_xor, r1, r1, mr);
4385
	rri_ins(i_xor, r1, r1, mr);
Line 4382... Line 4390...
4382
	if (!optop(e)) {
4390
	if (!optop(e)) {
4383
		setreorder();
4391
		setreorder();
4384
		checknan(e, guardreg(r, sp));
4392
		checknan(e, guardreg(r, sp));
4385
	}
4393
	}
4386
	cop_ins(i_ctc1, r, 31);
4394
	cop_ins(i_ctc1, r, 31);
4387
	cop_ins (i_mfc1, r, dfr << 1);
4395
	cop_ins(i_mfc1, r, dfr << 1);
4388
 
4396
 
4389
 
4397
 
4390
/*  cfc1    r,$31
4398
/*  cfc1    r,$31
4391
  cfc1    r,$31
4399
  cfc1    r,$31
4392
  ori     r1,dfr,0x3
4400
  ori     r1,dfr,0x3
Line 4397... Line 4405...
4397
	check
4405
	check
4398
  ctc1    r,$31
4406
  ctc1    r,$31
4399
	expansion of i_round_w_s etc
4407
	expansion of i_round_w_s etc
4400
*/
4408
*/
4401
 
4409
 
4402
	setregalt (aa, r);
4410
	setregalt(aa, r);
4403
	mka.regmove = move (aa, dest, sp, 1);
4411
	mka.regmove = move(aa, dest, sp, 1);
4404
	return mka;
4412
	return mka;
4405
      }
4413
      }
4406
 
4414
 
4407
 
4415
 
4408
    case int_to_bitf_tag:
4416
    case int_to_bitf_tag:
4409
      {
4417
      {
4410
	int   r;
4418
	int   r;
4411
	where w;
4419
	where w;
4412
	ash a;
4420
	ash a;
4413
	ash ai;
4421
	ash ai;
4414
	ans aa;
4422
	ans aa;
4415
	space nsp;
4423
	space nsp;
4416
	a = ashof (sh (e));
4424
	a = ashof(sh(e));
4417
	ai = ashof (sh (son (e)));
4425
	ai = ashof(sh(son(e)));
4418
	r = regfrmdest(&dest, sp);
4426
	r = regfrmdest(&dest, sp);
4419
 
4427
 
4420
	setregalt (w.answhere, r);
4428
	setregalt(w.answhere, r);
4421
	w.ashwhere = a;
4429
	w.ashwhere = a;
4422
	code_here (son (e), sp, w);
4430
	code_here(son(e), sp, w);
4423
	if (a.ashsize != ai.ashsize) {
4431
	if (a.ashsize != ai.ashsize) {
4424
	  rri_ins (i_and, r, r, (1 << a.ashsize) - 1);
4432
	  rri_ins(i_and, r, r,(1 << a.ashsize) - 1);
4425
	}
4433
	}
4426
	nsp = guardreg (r, sp);
4434
	nsp = guardreg(r, sp);
4427
	setregalt (aa, r);
4435
	setregalt(aa, r);
4428
	move (aa, dest, nsp, 0);
4436
	move(aa, dest, nsp, 0);
4429
	return mka;
4437
	return mka;
4430
      }
4438
      }
4431
 
4439
 
4432
 
4440
 
4433
    case bitf_to_int_tag:
4441
    case bitf_to_int_tag:
4434
      {
4442
      {
4435
	ash a;
4443
	ash a;
4436
	int   r;
4444
	int   r;
4437
	where w;
4445
	where w;
4438
	a = ashof (sh (son (e)));
4446
	a = ashof(sh(son(e)));
4439
	r = regfrmdest(&dest, sp);
4447
	r = regfrmdest(&dest, sp);
4440
 
4448
 
4441
	setregalt (w.answhere, r);
4449
	setregalt(w.answhere, r);
4442
	w.ashwhere = a;
4450
	w.ashwhere = a;
4443
	code_here (son (e), sp, w);
4451
	code_here(son(e), sp, w);
4444
	if (a.ashsize != 32) {
4452
	if (a.ashsize != 32) {
4445
	  if ( is_signed(sh (e)) ) {
4453
	  if (is_signed(sh(e))) {
4446
	    rri_ins (i_sll, r, r, 32 - a.ashsize);
4454
	    rri_ins(i_sll, r, r, 32 - a.ashsize);
4447
	    rri_ins (i_sra, r, r, 32 - a.ashsize);
4455
	    rri_ins(i_sra, r, r, 32 - a.ashsize);
4448
	  }
4456
	  }
4449
	  else {
4457
	  else {
4450
	    rri_ins (i_and, r, r, ((1 << a.ashsize) - 1));
4458
	    rri_ins(i_and, r, r,((1 << a.ashsize) - 1));
4451
	  }
4459
	  }
4452
	}
4460
	}
4453
 
4461
 
4454
	move (w.answhere, dest, guardreg (r, sp), 0);
4462
	move(w.answhere, dest, guardreg(r, sp), 0);
4455
	keepreg (e, r);
4463
	keepreg(e, r);
4456
	return mka;
4464
	return mka;
4457
      }
4465
      }
4458
 
4466
 
4459
 
4467
 
4460
    case movecont_tag: {
4468
    case movecont_tag: {
Line 4481... Line 4489...
4481
 	nsp = guardreg(szr, nsp);
4489
 	nsp = guardreg(szr, nsp);
4482
 	mr = getreg(nsp.fixed);
4490
 	mr = getreg(nsp.fixed);
4483
        bytemove = (al2(sh(szarg)) <= 8);
4491
        bytemove = (al2(sh(szarg)) <= 8);
4484
 
4492
 
4485
 
4493
 
4486
	if(name(szarg) != val_tag || no(szarg) == 0) {
4494
	if (name(szarg)!= val_tag || no(szarg) == 0) {
4487
		condrr_ins(i_beq, szr, 0, lout);
4495
		condrr_ins(i_beq, szr, 0, lout);
4488
	}
4496
	}
4489
	if (isnooverlap(e)) {
4497
	if (isnooverlap(e)) {
4490
		move_dlts(dr,sr,szr,mr, bytemove);
4498
		move_dlts(dr,sr,szr,mr, bytemove);
4491
	}
4499
	}
Line 4499... Line 4507...
4499
	}
4507
	}
4500
 	set_label(lout);
4508
 	set_label(lout);
4501
 	return mka;
4509
 	return mka;
4502
   }
4510
   }
4503
    case set_stack_limit_tag: {
4511
    case set_stack_limit_tag: {
4504
	baseoff b ;
4512
	baseoff b;
4505
	int r = reg_operand(son(e), sp);
4513
	int r = reg_operand(son(e), sp);
4506
	exp stl = find_named_tg("__TDFstacklim",
4514
	exp stl = find_named_tg("__TDFstacklim",
4507
				f_pointer(f_alignment(f_proc)));
4515
				f_pointer(f_alignment(f_proc)));
4508
	setvar(stl);
4516
	setvar(stl);
4509
	b = boff(stl);
4517
	b = boff(stl);
Line 4517... Line 4525...
4517
	exp stl = find_named_tg("__TDFstacklim",
4525
	exp stl = find_named_tg("__TDFstacklim",
4518
				f_pointer(f_alignment(f_proc)));
4526
				f_pointer(f_alignment(f_proc)));
4519
	setvar(stl);
4527
	setvar(stl);
4520
	b = boff(stl);
4528
	b = boff(stl);
4521
	ls_ins(i_lw, r, b);
4529
	ls_ins(i_lw, r, b);
4522
	setregalt (aa, r);
4530
	setregalt(aa, r);
4523
        move (aa, dest, guardreg (r, sp), 1);
4531
        move(aa, dest, guardreg(r, sp), 1);
4524
	return mka;
4532
	return mka;
4525
    }
4533
    }
4526
    case trap_tag: {
4534
    case trap_tag: {
4527
	if (no(e) == f_overflow) {
4535
	if (no(e) == f_overflow) {
4528
		do_exception(MIPS_SIGFPE);
4536
		do_exception(MIPS_SIGFPE);
Line 4537... Line 4545...
4537
    }
4545
    }
4538
 
4546
 
4539
 
4547
 
4540
 
4548
 
4541
    default:
4549
    default:
4542
      failer ("not done yet");
4550
      failer("not done yet");
4543
  }				/* end outer switch */
4551
  }				/* end outer switch */
4544
 
4552
 
4545
 
4553
 
4546
 
4554
 
4547
moveconst:
4555
moveconst:
Line 4551... Line 4559...
4551
    ans aa;
4559
    ans aa;
4552
 
4560
 
4553
    if (r != 0) {		/* somewhere! */
4561
    if (r != 0) {		/* somewhere! */
4554
      b.base = 0;
4562
      b.base = 0;
4555
      b.offset = constval;
4563
      b.offset = constval;
4556
      ls_ins (i_li, r, b);
4564
      ls_ins(i_li, r, b);
4557
      setregalt (aa, r);
4565
      setregalt(aa, r);
4558
      move (aa, dest, guardreg (r, sp), 1);
4566
      move(aa, dest, guardreg(r, sp), 1);
4559
    }
4567
    }
4560
    mka.regmove = r;
4568
    mka.regmove = r;
4561
    return mka;
4569
    return mka;
4562
  }
4570
  }
4563
 
4571