mirror of
https://github.com/SEPPDROID/Digital-Research-Source-Code.git
synced 2025-10-26 01:44:21 +00:00
Upload
Digital Research
This commit is contained in:
112
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v102/c168/sucomp.lis
Normal file
112
CPM OPERATING SYSTEMS/CPM 68K/1.0X SOURCES/v102/c168/sucomp.lis
Normal file
@@ -0,0 +1,112 @@
|
||||
1File: SUCOMP.C Page 1
|
||||
1 /*
|
||||
2 Copyright 1982
|
||||
3 Alcyon Corporation
|
||||
4 8716 Production Ave.
|
||||
5 San Diego, Ca. 92121
|
||||
6 */
|
||||
7
|
||||
8 #include "cgen.h"
|
||||
9 #include "cskel.h"
|
||||
10
|
||||
11 /* sucomp - Sethy-Ullman expression complexity measure computation*/
|
||||
12 /* This is a heuristic computation of the Sethy-Ullman numbers*/
|
||||
13 /* for expressions. This gives an approximation of the complexity*/
|
||||
14 /* of the expression. The code generation scheme works best if*/
|
||||
15 /* the most complex expressions are done first.*/
|
||||
16 sucomp(tp,nregs,flag) /* returns - none*/
|
||||
17 struct tnode *tp; /* pointer to tree*/
|
||||
18 int nregs; /* number of registers left*/
|
||||
19 int flag; /* 1=>set values in tree, 0=>return*/
|
||||
20 {
|
||||
21 register int su, sur, op, i;
|
||||
22 register struct tnode *ltp, *rtp;
|
||||
23
|
||||
24 nregs = dreg(nregs);
|
||||
25 if( binop(op=tp->t_op) ) {
|
||||
26 ltp = tp->t_left;
|
||||
27 rtp = tp->t_right;
|
||||
28 }
|
||||
29 else if( unaryop(op) )
|
||||
30 ltp = tp->t_left;
|
||||
31 switch( op ) {
|
||||
32
|
||||
33 case CLONG:
|
||||
34 if( tp->t_lvalue >= 0x8000L || tp->t_lvalue <= 0xffff8000L ) {
|
||||
35 su = SU_ADDR;
|
||||
36 break;
|
||||
37 }
|
||||
38 i = tp->t_lvalue;
|
||||
39 case CINT:
|
||||
40 if( op == CINT )
|
||||
41 i = tp->t_value;
|
||||
42 if( i == 0 )
|
||||
43 su = SU_ZERO;
|
||||
44 else if( i == 1 )
|
||||
45 su = SU_ONE;
|
||||
46 else if( i >= 1 && i <= QUICKVAL )
|
||||
47 su = SU_SMALL;
|
||||
48 else if( i >= -128 && i <= 127 )
|
||||
49 su = SU_QUICK;
|
||||
50 else
|
||||
51 su = SU_CONST;
|
||||
52 break;
|
||||
53
|
||||
54 case COMMA:
|
||||
55 su = max(sucomp(rtp,nregs,flag),sucomp(ltp,nregs,flag));
|
||||
56 su = max(su,SU_EASY);
|
||||
57 break;
|
||||
58
|
||||
59 case ADDR:
|
||||
1File: SUCOMP.C Page 2
|
||||
60 su = sucomp(ltp,nregs,flag);
|
||||
61 break;
|
||||
62
|
||||
63 case CFLOAT:
|
||||
64 case DCLONG:
|
||||
65 case AUTOINC:
|
||||
66 case AUTODEC:
|
||||
67 su = SU_ADDR;
|
||||
68 break;
|
||||
69
|
||||
70 case SYMBOL:
|
||||
71 if( tp->t_sc != REGISTER )
|
||||
72 su = SU_ADDR;
|
||||
73 else if( isdreg(tp->t_reg) )
|
||||
74 su = SU_REG;
|
||||
75 else
|
||||
76 su = SU_AREG;
|
||||
77 break;
|
||||
78
|
||||
79 case LDIV:
|
||||
80 case LMOD:
|
||||
81 case LMULT:
|
||||
82 case CALL:
|
||||
83 sucomp(rtp,nregs,flag);
|
||||
84 case NACALL:
|
||||
85 sucomp(ltp,nregs,flag);
|
||||
86 su = SU_VHARD; /*very hard*/
|
||||
87 break;
|
||||
88
|
||||
89 default:
|
||||
90 su = sucomp(ltp,nregs,flag);
|
||||
91 if( binop(op) ) {
|
||||
92 if( su <= SU_ADDR )
|
||||
93 su = max(su,sucomp(rtp,nregs,flag));
|
||||
94 else {
|
||||
95 sur = sucomp(rtp,nregs+1,flag);
|
||||
96 if( sur > SU_ADDR && nregs > HICREG )
|
||||
97 su = max(su,SU_HARD);
|
||||
98 }
|
||||
99 su = max(SU_EASY,su);
|
||||
100 }
|
||||
101 else if( su <= SU_XREG )
|
||||
102 su = max(SU_EASY,su);
|
||||
103 if( isfloat(tp->t_type) )
|
||||
104 su = SU_VHARD;
|
||||
105 break;
|
||||
106 }
|
||||
107 if( flag )
|
||||
108 tp->t_su = su;
|
||||
109 return(su);
|
||||
110 }
|
||||
Reference in New Issue
Block a user