annotate mc-code-powerpc.c @ 127:eb4d8975926c

Intel float fix
author kono
date Tue, 01 Apr 2003 10:31:40 +0900
parents 1d1612fe705a
children d497c39add36
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1 /* Micro-C Code Generatation Part for Power PC (Mac OS X) */
917947ffeb7c power pc version
kono
parents:
diff changeset
2 /* $Id$ */
917947ffeb7c power pc version
kono
parents:
diff changeset
3
917947ffeb7c power pc version
kono
parents:
diff changeset
4 #define EXTERN extern
917947ffeb7c power pc version
kono
parents:
diff changeset
5 #include "mc.h"
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
6 #include "mc-code.h"
89
917947ffeb7c power pc version
kono
parents:
diff changeset
7 #include "mc-codegen.h"
917947ffeb7c power pc version
kono
parents:
diff changeset
8
917947ffeb7c power pc version
kono
parents:
diff changeset
9 #define TEXT_EMIT_MODE 0
917947ffeb7c power pc version
kono
parents:
diff changeset
10 #define DATA_EMIT_MODE 1
917947ffeb7c power pc version
kono
parents:
diff changeset
11 #define RODATA_EMIT_MODE 2
917947ffeb7c power pc version
kono
parents:
diff changeset
12
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
13 static void data_mode(char *name);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
14 static void init_ptr_cache();
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
15 static void ld_indexx(int byte, int n, int xreg);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
16 static void local_table(void);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
17 static void shift(char *op, int reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
18 static int struct_push(int e4,int t,int arg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
19
89
917947ffeb7c power pc version
kono
parents:
diff changeset
20 static int output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
21 static int data_alignment = 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
22
917947ffeb7c power pc version
kono
parents:
diff changeset
23 static int code_disp_label;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
24 static int code_setup;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
25 static int r1_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
26 static int lvar_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
27
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
28 static int reg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
29 static int freg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
30
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
31 int size_of_int = 4;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
32 int size_of_float = 4;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
33 int size_of_double = 8;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
34 int size_of_longlong = 8;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
35 int endian = 1;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
36
89
917947ffeb7c power pc version
kono
parents:
diff changeset
37
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
38 #define REG_fp 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
39 #define REG_sp 30
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
40 #define REG_VAR_BASE 29
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
41 #define REG_VAR_MIN 22
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
42 #define MIN_TMP_REG 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
43 #define MAX_TMP_REG 15
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
44
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
45 #define PTRC_REG 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
46
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
47 #define FREG_VAR_BASE 31
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
48 #define FREG_VAR_MIN 24
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
49 #define MIN_TMP_FREG 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
50 #define MAX_TMP_FREG 15
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
51
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
52 #define RET_REGISTER 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
53 #define RET_FREGISTER 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
54
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
55 int MAX_REGISTER=30; /* PowerPCのレジスタを10個まで使う*/
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
56 int MAX_FREGISTER=31;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
57 #define REAL_MAX_REGISTER 32 /* PowerPCのレジスタが32ということ*/
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
58 #define REAL_MAX_FREGISTER 32 /* PowerPCのレジスタが32ということ*/
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
59
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
60 int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
61 int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
62 int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
63 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
64
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
65 #define CREG_REGISTER MAX_TMP_REG
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
66 #define FREG_FREGISTER MAX_TMP_FREG
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
67
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
68 int powerpc_regs[REAL_MAX_REGISTER];
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
69 int powerpc_regv[REAL_MAX_REGISTER];
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
70
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
71 int *regv = powerpc_regv;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
72 int *regs = powerpc_regs;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
73
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
74 int powerpc_fregs[REAL_MAX_FREGISTER];
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
75 int powerpc_fregv[REAL_MAX_FREGISTER];
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
76
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
77 int *fregv = powerpc_fregv;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
78 int *fregs = powerpc_fregs;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
79
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
80 static int max_reg_var, max_freg_var;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
81 static int cond_reg=-1,cond_freg=-1;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
82
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
83 static char *reg_name[] = {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
84 "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
85 "r10","r11","r12","r13","r14","r15","r16","r17","r18","r19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
86 "r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
87 "r30","r31"
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
88 };
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
89
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
90 static char *freg_name[] = {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
91 "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
92 "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
93 "f20","f21","f22","f23","f24","f25","f26","f27","f28","f29",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
94 "f30","f31"
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
95 };
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
96
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
97 #define register_name(i) reg_name[i]
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
98 #define fregister_name(i) freg_name[i]
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
99
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
100 static
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
101 NMTBL float_zero = {"_float_zero",STATIC,FLOAT,0};
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
102 static
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
103 NMTBL float_one = {"_float_one",STATIC,FLOAT,0};
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
104
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
105
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
106 static char * fload(int d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
107 static int code_d1(double d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
108 static int code_d2(double d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
109 static void code_save_stacks();
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
110 static void code_save_input_registers();
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
111 static void clear_ptr_cache_reg(int r);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
112 static void set_creg(int,int);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
113 static void set_freg(int,int);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
114
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
115 int max_func_args;
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
116 int my_func_args;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
117 #define ARG_LVAR_OFFSET 0x10000000
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
118
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
119 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
120
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
121 r0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
122 r3-r10 input register
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
123 r22-r29 saved register variable (input register for code segement)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
124 r30 stack pointer
917947ffeb7c power pc version
kono
parents:
diff changeset
125 r31 0
917947ffeb7c power pc version
kono
parents:
diff changeset
126 r1 frame pointer
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
127
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
128 f0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
129 f1-r8 input register
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
130 f24-f31 saved register variable
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
131
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
132 function call stack frame
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
133 <------r1_offset------------------------------>
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
134 <------------lvar_offset------->
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
135 r+ +------------+---+---------------+----------+--------------+----+ -
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
136 callee arg xx register save local caller arg xx
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
137 reg_save disp max_func_args*size_of_int
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
138 lvar>0 lvar<0 lvar>0x1000 0000
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
139
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
140 code segment stack frame
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
141
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
142 * gotoを呼び出した関数のr1 ! r1(goto前のr1)
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
143 # * r30 <---------------r1_offset---------------> r1
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
144 r+ +----------+--+----------+----------------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
145 cousin arg xx reg save !callee arg !code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
146 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
147 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
148 *size_of_int *size_of_int
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
149
89
917947ffeb7c power pc version
kono
parents:
diff changeset
150 */
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
151 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
152 #define func_disp_offset 60
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
153 #define r1_offset func_disp_offset+12
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
154 int code_disp_offset = 0; int jump_offset = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
155 #define CODE_LVAR l+code_disp_offset
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
156 #define FUNC_LVAR l+disp_offset
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
157 #define CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
158 #define CALLEE_ARG l+arg_offset
89
917947ffeb7c power pc version
kono
parents:
diff changeset
159
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
160 void
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
161 code_offset_set()
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
162 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
163 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
164 int l;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
165 #endif
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
166 int lvar_offsetv = -disp+max_func_args*size_of_int+func_disp_offset;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
167 int r1_offsetv = -disp+max_func_args*size_of_int-reg_save+r1_offset;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
168 printf(".set L_%d,%d\n",lvar_offset_label,lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
169 printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
170 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
171 printf("# function %s\n",fnptr->nm);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
172 l = ARG_LVAR_OFFSET;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
173 printf("# offset call0\t%d\n",CALLER_ARG);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
174 l = ARG_LVAR_OFFSET+max_func_args*size_of_int;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
175 printf("# offset calln\t%d %d\n",CALLER_ARG,max_func_args*size_of_int);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
176 l = disp;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
177 printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
178 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
179 printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
180 l = -reg_save;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
181 printf("# offset regs\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
182 printf("# offset r1off\t%d\n",r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
183 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
184 printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
185 l = my_func_args;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
186 printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
187 #endif
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
188 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
189
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
190
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
191 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
192 lvar8(int l)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
193 {
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
194 if (fnptr->sc==CODE) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
195 printf("lo16(%d)(r30)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
196 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
197 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
198 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
199 printf("lo16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
200 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
201 printf("lo16(%d+L_%d)(r30)\n",CALLEE_ARG,r1_offset_label);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
202 }
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
203 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
204
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
205 /* if size of local variables / input variables is more then 64k,
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
206 lo16 does not work. We have to use ha16 also. But we can't know
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
207 the exact size in one path compile. We may safely use lvar16ha
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
208 if disp or max_func_args > 32k. Of course this is reduantant for
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
209 smaller offset. But who cares who use very large local variables?
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
210 */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
211
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
212 #define LARGE_LVAR (disp<-32765||max_func_args>32765)
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
213
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
214 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
215 lvar16ha(int l)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
216 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
217 if (fnptr->sc==CODE) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
218 printf("la r0,ha16(%d)(r30)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
219 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
220 printf("la r0,ha16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
221 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
222 if (CALLER_ARG>32765)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
223 printf("la r0,ha16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
224 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
225 printf("la r0,ha16(%d+L_%d)(r30)\n",CALLEE_ARG,r1_offset_label);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
226 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
227 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
228
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
229 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
230 lvar16lo(int l)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
231 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
232 if (fnptr->sc==CODE) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
233 printf("lo16(%d)(r0)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
234 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
235 printf("lo16(%d+L_%d)(r0)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
236 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
237 if (CALLER_ARG>32765)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
238 printf("lo16(%d)(r0)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
239 else
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
240 printf("lo16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
241 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
242 printf("lo16(%d+L_%d)(r0)\n",CALLEE_ARG,r1_offset_label);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
243 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
244 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
245
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
246 #define lvar_intro(i) if (LARGE_LVAR) lvar16ha(i)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
247
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
248 #define lvar(i) if (LARGE_LVAR) lvar16lo(i); else lvar8(i)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
249
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
250 void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
251 code_lvar(int e2,int creg) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
252 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
253 printf("\tla %s,",register_name(creg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
254 lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
255 regv[creg]=1;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
256 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
257
89
917947ffeb7c power pc version
kono
parents:
diff changeset
258 void
917947ffeb7c power pc version
kono
parents:
diff changeset
259 code_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
260 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
261 init_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
262 }
917947ffeb7c power pc version
kono
parents:
diff changeset
263
917947ffeb7c power pc version
kono
parents:
diff changeset
264 void
917947ffeb7c power pc version
kono
parents:
diff changeset
265 gexpr_code_init(void){
917947ffeb7c power pc version
kono
parents:
diff changeset
266 regv[creg]=0;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
267 fregv[freg]=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
268 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
269
89
917947ffeb7c power pc version
kono
parents:
diff changeset
270
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
271 void
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
272 code_arg_register()
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
273 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
274 if (is_function(fnptr))
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
275 code_save_input_registers();
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
276 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
277
89
917947ffeb7c power pc version
kono
parents:
diff changeset
278 int
917947ffeb7c power pc version
kono
parents:
diff changeset
279 get_register(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
280 { /* 使われていないレジスタを調べる */
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
281 int i,reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
282 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
283 if (regs[i]) continue; /* 使われている */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
284 regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
285 return i; /* その場所を表す番号を返す */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
286 }
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
287 /* INPUT_REG か PTR_CACHE をつぶす */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
288 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
289 if (regs[i]==PTRC_REG) {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
290 clear_ptr_cache_reg(i);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
291 } else
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
292 continue;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
293 regs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
294 return i; /* その場所を表す番号を返す */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
295 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
296 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
297 for(i=0;i<reg_sp;i++) {
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
298 if ((reg=reg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
299 code_assign_lvar(
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
300 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
301 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
302 return reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
303 }
917947ffeb7c power pc version
kono
parents:
diff changeset
304 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
305 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
306 error(-1); return creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
307 }
917947ffeb7c power pc version
kono
parents:
diff changeset
308
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
309 int
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
310 pop_register(void)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
311 { /* レジスタから値を取り出す */
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
312 return reg_stack[--reg_sp];
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
313 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
314
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
315 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
316 get_fregister(void)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
317 { /* 使われていないレジスタを調べる */
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
318 int i,reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
319 for(i=MAX_TMP_FREG;i>MIN_TMP_FREG;i--) {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
320 if (fregs[i]) continue; /* 使われている */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
321 fregs[i]=USING_REG; /* そのレジスタを使うことを宣言し */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
322 return i; /* その場所を表す番号を返す */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
323 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
324 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
325 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
326 if ((reg=freg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
327 code_dassign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
328 (freg_stack[i]=new_lvar(size_of_double)),reg,1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
329 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
330 return reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
331 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
332 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
333 /* 空いている場所がないなら、エラー (いったい誰が使ってるの?) */
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
334 error(REG_ERR); return freg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
335 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
336
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
337
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
338 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
339 pop_fregister(void)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
340 { /* レジスタから値を取り出す */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
341 return freg_stack[--freg_sp];
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
342 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
343
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
344 void
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
345 emit_pop_free(int xreg)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
346 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
347 if (xreg>=0)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
348 free_register(xreg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
349 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
350
89
917947ffeb7c power pc version
kono
parents:
diff changeset
351 void
917947ffeb7c power pc version
kono
parents:
diff changeset
352 free_register(int i) { /* いらなくなったレジスタを開放 */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
353 if (i<0||MAX_REGISTER<i) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
354 regv[i]=regs[i]=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
355 }
917947ffeb7c power pc version
kono
parents:
diff changeset
356
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
357 void
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
358 free_fregister(int i) { /* いらなくなったレジスタを開放 */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
359 if (i<0||MAX_FREGISTER<i) error(-1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
360 fregv[i]=fregs[i]=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
361 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
362
89
917947ffeb7c power pc version
kono
parents:
diff changeset
363 int
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
364 get_input_fregister_var(int i,NMTBL *n,int is_code)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
365 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
366 if (is_code) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
367 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
368 i = REG_VAR_BASE-i;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
369 } else {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
370 if (i<0||MAX_FREGISTER<i+MIN_TMP_FREG) return 0;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
371 return list3(DREGISTER,i+MIN_TMP_FREG,(int)n);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
372 i = i+MIN_TMP_FREG;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
373 }
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
374 return list3(DREGISTER,i,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
375 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
376
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
377 int
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
378 get_input_register_var(int i,NMTBL *n,int is_code)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
379 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
380 if (is_code) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
381 if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
382 i = REG_VAR_BASE-i;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
383 } else {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
384 if (i<0||MAX_REGISTER<i+MIN_TMP_REG) return 0;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
385 i = i+MIN_TMP_REG;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
386 }
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
387 return list3(REGISTER,i,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
388 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
389
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
390 int
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
391 free_register_count(void)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
392 {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
393 int i,count,fcount;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
394 fcount = count = 0;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
395 for(i=0;i<MAX_REGISTER;i++) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
396 if (! regs[i] && ! regv[i]) count++;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
397 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
398 for(i=0;i<MAX_FREGISTER;i++) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
399 if (! fregs[i] && ! fregv[i]) fcount++;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
400 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
401 fprintf(stderr,"# free reg %d freg %d\n",count,fcount);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
402 return count+fcount;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
403 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
404
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
405 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
406 register_full(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
407 {
917947ffeb7c power pc version
kono
parents:
diff changeset
408 int i;
917947ffeb7c power pc version
kono
parents:
diff changeset
409 for(i=0;i<MAX_REGISTER;i++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
410 if (! regs[i]) {
917947ffeb7c power pc version
kono
parents:
diff changeset
411 return 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
412 }
917947ffeb7c power pc version
kono
parents:
diff changeset
413 }
917947ffeb7c power pc version
kono
parents:
diff changeset
414 return 1;
917947ffeb7c power pc version
kono
parents:
diff changeset
415 }
917947ffeb7c power pc version
kono
parents:
diff changeset
416
917947ffeb7c power pc version
kono
parents:
diff changeset
417 void
917947ffeb7c power pc version
kono
parents:
diff changeset
418 free_all_register(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
419 {
917947ffeb7c power pc version
kono
parents:
diff changeset
420 int i;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
421 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; regv[i]=0; }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
422 for(i=0;i<MAX_FREGISTER;i++) { fregs[i]=0; fregv[i]=0; }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
423 creg = get_register();
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
424 freg = get_fregister();
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
425 set_creg(CREG_REGISTER,0);
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
426 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
427 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
428 }
917947ffeb7c power pc version
kono
parents:
diff changeset
429
917947ffeb7c power pc version
kono
parents:
diff changeset
430 void
917947ffeb7c power pc version
kono
parents:
diff changeset
431 register_usage(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
432 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
433 #if 0
89
917947ffeb7c power pc version
kono
parents:
diff changeset
434 int i;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
435 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
436 if (chk) return;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
437 if (!lsrc) return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
438 printf("# %d: %s:",lineno,s);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
439 printf(" creg=%s fgreg=%s",register_name(creg),fregister_name(freg));
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
440 #if 0
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
441 printf("\n# regs:");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
442 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regv[i]); }
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
443 printf(":");
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
444 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
445 printf("\n# freg:");
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
446 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",fregs[i]); }
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
447 printf(" regs_stack",register_name(creg),register_name(dreg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
448 for(i=reg_sp;i>=0;i--) {
917947ffeb7c power pc version
kono
parents:
diff changeset
449 if(reg_stack[i]>=0)
917947ffeb7c power pc version
kono
parents:
diff changeset
450 printf(" %s",register_name(reg_stack[i],0));
917947ffeb7c power pc version
kono
parents:
diff changeset
451 }
917947ffeb7c power pc version
kono
parents:
diff changeset
452 #endif
917947ffeb7c power pc version
kono
parents:
diff changeset
453 printf("\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
454 }
917947ffeb7c power pc version
kono
parents:
diff changeset
455
917947ffeb7c power pc version
kono
parents:
diff changeset
456 void
917947ffeb7c power pc version
kono
parents:
diff changeset
457 gexpr_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
458 {
917947ffeb7c power pc version
kono
parents:
diff changeset
459 while(reg_sp > 0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
460 free_register(reg_stack[--reg_sp]);
917947ffeb7c power pc version
kono
parents:
diff changeset
461 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
462 if (cond_freg!=-1) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
463 if(car(cond_freg)==DREGISTER) free_fregister(cadr(cond_freg));
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
464 cond_freg=-1;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
465 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
466 if (cond_reg!=-1) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
467 if(car(cond_reg)==REGISTER) free_register(cadr(cond_reg));
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
468 cond_reg=-1;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
469 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
470 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
471 gexpr_code_init();
917947ffeb7c power pc version
kono
parents:
diff changeset
472 register_usage("gexpr_init");
917947ffeb7c power pc version
kono
parents:
diff changeset
473 }
917947ffeb7c power pc version
kono
parents:
diff changeset
474
917947ffeb7c power pc version
kono
parents:
diff changeset
475
917947ffeb7c power pc version
kono
parents:
diff changeset
476 void
917947ffeb7c power pc version
kono
parents:
diff changeset
477 emit_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
478 {
917947ffeb7c power pc version
kono
parents:
diff changeset
479 free_all_register();
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
480 max_reg_var=-1; max_freg_var=-1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
481 reg_sp = 0;
123
5f180dc8d84e intel fix.
kono
parents: 122
diff changeset
482 freg_sp = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
483 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
484 }
917947ffeb7c power pc version
kono
parents:
diff changeset
485
917947ffeb7c power pc version
kono
parents:
diff changeset
486 int
917947ffeb7c power pc version
kono
parents:
diff changeset
487 register_var(int r) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
488 return r;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
489 }
917947ffeb7c power pc version
kono
parents:
diff changeset
490
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
491
89
917947ffeb7c power pc version
kono
parents:
diff changeset
492 int
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
493 get_register_var(NMTBL *n)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
494 {
917947ffeb7c power pc version
kono
parents:
diff changeset
495 int i;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
496 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
497 if (! regs[REG_VAR_BASE-i]) { /* 使われていないなら */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
498 regs[REG_VAR_BASE-i]=USING_REG; /* そのレジスタを使うことを宣言し */
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
499 regv[REG_VAR_BASE-i]=0;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
500 if (i>max_reg_var) max_reg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
501 /* その場所を表す番号を返す */
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
502 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
503 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
504 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
505 return list2(LVAR,new_lvar(size_of_int));
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
506 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
507
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
508 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
509 fregister_var(int r) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
510 return r;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
511 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
512
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
513 int
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
514 get_fregister_var(NMTBL *n)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
515 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
516 int i;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
517 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
518 if (! regs[FREG_VAR_BASE-i]) { /* 使われていないなら */
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
519 regs[FREG_VAR_BASE-i]=USING_REG; /*そのレジスタを使うことを宣言し*/
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
520 regv[FREG_VAR_BASE-i]=0;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
521 if (i>max_freg_var) max_freg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
522 /* その場所を表す番号を返す */
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
523 return list3(DREGISTER,FREG_VAR_BASE-i,(int)n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
524 }
917947ffeb7c power pc version
kono
parents:
diff changeset
525 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
526 return list2(LVAR,new_lvar(size_of_double));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
527 }
917947ffeb7c power pc version
kono
parents:
diff changeset
528
917947ffeb7c power pc version
kono
parents:
diff changeset
529 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
530 emit_push()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
531 {
917947ffeb7c power pc version
kono
parents:
diff changeset
532 int new_reg;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
533 if (reg_sp>MAX_MAX) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
534 new_reg = get_register();
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
535 reg_stack[reg_sp++] = creg; /* push するかわりにレジスタを使う */
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
536 creg = new_reg;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
537 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
538 }
917947ffeb7c power pc version
kono
parents:
diff changeset
539
917947ffeb7c power pc version
kono
parents:
diff changeset
540 int
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
541 emit_pop(int type)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
542 {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
543 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
544 xreg=pop_register();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
545 if (xreg<= -REG_LVAR_OFFSET) {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
546 reg = get_register();
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
547 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
548 free_lvar(REG_LVAR_OFFSET+xreg);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
549 xreg = reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
550 regv[xreg]=1;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
551 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
552 return xreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
553 }
917947ffeb7c power pc version
kono
parents:
diff changeset
554
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
555 static int code_base;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
556
917947ffeb7c power pc version
kono
parents:
diff changeset
557 #define MAX_PTR_CACHE 10
917947ffeb7c power pc version
kono
parents:
diff changeset
558
917947ffeb7c power pc version
kono
parents:
diff changeset
559 int ptr_cache=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
560
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
561 void
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
562 init_ptr_cache()
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
563 {
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
564 int i;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
565 for(i=0;i<MAX_PTR_CACHE;i++) {
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
566 ptr_cache=glist3(0,ptr_cache,0);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
567 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
568 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
569
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
570 void
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
571 clear_ptr_cache_reg(int r)
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
572 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
573 int ptcptr=ptr_cache;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
574 while(ptcptr) {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
575 if(car(ptcptr)&&caddr(ptcptr)==r) {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
576 car(ptcptr)=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
577 caddr(ptcptr)=0;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
578 free_register(r);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
579 return;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
580 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
581 ptcptr=cadr(ptcptr);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
582 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
583 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
584
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
585 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
586 clear_ptr_cache()
917947ffeb7c power pc version
kono
parents:
diff changeset
587 {
917947ffeb7c power pc version
kono
parents:
diff changeset
588 int ptcptr=ptr_cache;
917947ffeb7c power pc version
kono
parents:
diff changeset
589 while(ptcptr) {
917947ffeb7c power pc version
kono
parents:
diff changeset
590 if(car(ptcptr))
917947ffeb7c power pc version
kono
parents:
diff changeset
591 free_register(caddr(ptcptr));
917947ffeb7c power pc version
kono
parents:
diff changeset
592 car(ptcptr)=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
593 caddr(ptcptr)=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
594 ptcptr=cadr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
595 }
917947ffeb7c power pc version
kono
parents:
diff changeset
596 }
917947ffeb7c power pc version
kono
parents:
diff changeset
597
917947ffeb7c power pc version
kono
parents:
diff changeset
598
917947ffeb7c power pc version
kono
parents:
diff changeset
599 int
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
600 get_ptr_cache(NMTBL *nptr)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
601 {
917947ffeb7c power pc version
kono
parents:
diff changeset
602 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
603 int ptcptr=ptr_cache;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
604 int g = (int)nptr;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
605 int p,p1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
606 char *rrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
607
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
608 p1 = ptcptr; p = cadr(p1); /* unnecesary, if ptcptr is initialized */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
609 while(ptcptr) {
917947ffeb7c power pc version
kono
parents:
diff changeset
610 if(car(ptcptr)==g) return caddr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
611 p1=p; p=ptcptr;
917947ffeb7c power pc version
kono
parents:
diff changeset
612 ptcptr=cadr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
613 }
917947ffeb7c power pc version
kono
parents:
diff changeset
614 cadr(p1)=0; /* remove the last one */
917947ffeb7c power pc version
kono
parents:
diff changeset
615 cadr(p) = ptr_cache; /* connect current queue to the last one */
917947ffeb7c power pc version
kono
parents:
diff changeset
616 ptr_cache = p; /* now the last one is the top */
917947ffeb7c power pc version
kono
parents:
diff changeset
617 if (!caddr(p)) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
618 if((r=get_register())) {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
619 caddr(p)=r; regs[r]=PTRC_REG;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
620 } else {
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
621 error(-1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
622 r=creg; /* this can't happen */
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
623 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
624 car(p)=g;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
625 } else {
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
626 r = caddr(p);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
627 }
917947ffeb7c power pc version
kono
parents:
diff changeset
628 rrn = register_name(r);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
629 if (nptr->sc==STATIC) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
630 printf("\taddis %s,r31,ha16(_%s-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
631 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
632 printf("\tla %s,lo16(_%s-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
633 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
634 } else {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
635 printf("\taddis %s,r31,ha16(L_%s$non_lazy_ptr-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
636 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
637 printf("\tlwz %s,lo16(L_%s$non_lazy_ptr-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
638 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
639 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
640 return r;
917947ffeb7c power pc version
kono
parents:
diff changeset
641 }
917947ffeb7c power pc version
kono
parents:
diff changeset
642
917947ffeb7c power pc version
kono
parents:
diff changeset
643 void
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
644 code_label(int labelno)
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
645 {
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
646 clear_ptr_cache();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
647 printf("L_%d:\n",labelno);
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
648 }
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
649
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
650 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
651 code_gvar(int e1,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
652 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
653 r = get_ptr_cache((NMTBL*)cadr(e1));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
654 if(r!=creg)
917947ffeb7c power pc version
kono
parents:
diff changeset
655 printf("\tmr %s,%s\n",register_name(creg),register_name(r));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
656 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
657 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
658 }
917947ffeb7c power pc version
kono
parents:
diff changeset
659
917947ffeb7c power pc version
kono
parents:
diff changeset
660 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
661 code_rgvar(int e1,int creg) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
662 printf("\tlwz %s,0(%s)\n",register_name(creg),
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
663 register_name(get_ptr_cache((NMTBL*)cadr(e1))));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
664 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
665 }
917947ffeb7c power pc version
kono
parents:
diff changeset
666
917947ffeb7c power pc version
kono
parents:
diff changeset
667 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
668 code_crgvar(int e1,int creg){
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
669 char *crn = register_name(creg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
670 printf("\tlbz %s,0(%s)\n",crn,
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
671 register_name(get_ptr_cache((NMTBL*)cadr(e1))));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
672 printf("\textsb %s,%s\n",crn,crn);
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
673 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
674 }
917947ffeb7c power pc version
kono
parents:
diff changeset
675
917947ffeb7c power pc version
kono
parents:
diff changeset
676
917947ffeb7c power pc version
kono
parents:
diff changeset
677 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
678 code_register(int e2,int creg) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
679 if (creg!=e2)
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
680 printf("\tmr %s,%s\n",register_name(creg),register_name(e2));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
681 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
682 }
917947ffeb7c power pc version
kono
parents:
diff changeset
683
917947ffeb7c power pc version
kono
parents:
diff changeset
684
917947ffeb7c power pc version
kono
parents:
diff changeset
685 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
686 code_rlvar(int e2,int reg) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
687 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
688 printf("\tlwz %s,",register_name(reg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
689 lvar(e2);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
690 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
691 }
917947ffeb7c power pc version
kono
parents:
diff changeset
692
917947ffeb7c power pc version
kono
parents:
diff changeset
693
917947ffeb7c power pc version
kono
parents:
diff changeset
694 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
695 code_crlvar(int e2,int reg) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
696 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
697 printf("\tlbz %s,",register_name(reg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
698 lvar(e2);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
699 printf("\textsb %s,%s\n",register_name(reg),register_name(reg));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
700 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
701 }
917947ffeb7c power pc version
kono
parents:
diff changeset
702
917947ffeb7c power pc version
kono
parents:
diff changeset
703
917947ffeb7c power pc version
kono
parents:
diff changeset
704 void
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
705 code_fname(NMTBL *n,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
706 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
707 r = get_ptr_cache(n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
708 if(r!=creg)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
709 printf("\tmr %s,%s\n",register_name(creg),register_name(r));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
710 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
711 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
712 }
917947ffeb7c power pc version
kono
parents:
diff changeset
713
917947ffeb7c power pc version
kono
parents:
diff changeset
714
917947ffeb7c power pc version
kono
parents:
diff changeset
715 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
716 code_const(int e2,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
717 char *crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
718 if (-32768<e2&&e2<32768)
917947ffeb7c power pc version
kono
parents:
diff changeset
719 printf("\tli %s,%d\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
720 else {
917947ffeb7c power pc version
kono
parents:
diff changeset
721 printf("\tlis %s,ha16(%d)\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
722 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
723 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
724 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
725 }
917947ffeb7c power pc version
kono
parents:
diff changeset
726
917947ffeb7c power pc version
kono
parents:
diff changeset
727
917947ffeb7c power pc version
kono
parents:
diff changeset
728 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
729 code_neg(int creg) {
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
730 printf("\tneg %s,%s\n", register_name(creg), register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
731 }
917947ffeb7c power pc version
kono
parents:
diff changeset
732
917947ffeb7c power pc version
kono
parents:
diff changeset
733
917947ffeb7c power pc version
kono
parents:
diff changeset
734 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
735 code_not(int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
736 printf("\tnor %s,%s,%s\n",
917947ffeb7c power pc version
kono
parents:
diff changeset
737 register_name(creg), register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
738 }
917947ffeb7c power pc version
kono
parents:
diff changeset
739
917947ffeb7c power pc version
kono
parents:
diff changeset
740
917947ffeb7c power pc version
kono
parents:
diff changeset
741 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
742 code_lnot(int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
743 printf("\tsubfic r0,%s,0\n", register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
744 printf("\tadde %s,r0,%s\n", register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
745 }
917947ffeb7c power pc version
kono
parents:
diff changeset
746
917947ffeb7c power pc version
kono
parents:
diff changeset
747 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
748 code_preinc(int e1,int e2,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
749 char *xrn,*drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
750 int i,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
751 if (car(e2)==REGISTER) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
752 printf("\taddi %s,%s,%d\n",
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
753 register_name(cadr(e2)),register_name(cadr(e2)), caddr(e1));
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
754 if (cadr(reg)!=e2)
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
755 printf("\tmr %s,%s\n",register_name(cadr(reg)),register_name(e2));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
756 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
757 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
758 }
917947ffeb7c power pc version
kono
parents:
diff changeset
759 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
760 xrn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
761 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
762 drn = register_name(dreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
763 printf("\tlwz %s,0(%s)\n",drn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
764 printf("\taddi %s,%s,%d\n",drn,drn,caddr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
765 printf("\tstw %s,0(%s)\n",drn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
766 i=creg;creg=dreg;dreg=i;
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
767 regv[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
768 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
769 }
917947ffeb7c power pc version
kono
parents:
diff changeset
770
917947ffeb7c power pc version
kono
parents:
diff changeset
771
917947ffeb7c power pc version
kono
parents:
diff changeset
772 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
773 code_postinc(int e1,int e2,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
774 char *xrn,*crn,*nrn;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
775 int dreg,nreg,i;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
776 if (car(e2)==REGISTER) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
777 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
778 printf("\taddi %s,%s,%d\n",
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
779 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
780 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
781 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
782 }
917947ffeb7c power pc version
kono
parents:
diff changeset
783 g_expr(e2);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
784 crn = register_name(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
785 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
786 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
787 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
788 nrn = register_name(nreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
789 printf("\tlwz %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
790 printf("\taddi %s,%s,%d\n",nrn,xrn,caddr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
791 printf("\tstw %s,0(%s)\n",nrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
792 i=creg;creg=dreg;dreg=i;
917947ffeb7c power pc version
kono
parents:
diff changeset
793 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
794 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
795 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
796 }
917947ffeb7c power pc version
kono
parents:
diff changeset
797
917947ffeb7c power pc version
kono
parents:
diff changeset
798
917947ffeb7c power pc version
kono
parents:
diff changeset
799 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
800 code_cpostinc(int e1,int e2,int reg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
801 char *xrn,*crn,*nrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
802 int i,nreg,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
803 if (car(e2)==REGISTER) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
804 printf("\tlbz %s,0(%s)\n",register_name(reg),register_name(cadr(e2)));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
805 printf("\textsb %s,%s\n",register_name(reg),register_name(reg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
806 printf("\taddi %s,%s,%d\n",
917947ffeb7c power pc version
kono
parents:
diff changeset
807 register_name(cadr(e2)),register_name(cadr(e2)),caddr(e1));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
808 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
809 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
810 }
917947ffeb7c power pc version
kono
parents:
diff changeset
811 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
812 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
813 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
814 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
815 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
816 nrn = register_name(nreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
817 printf("\tlwz %s,0(%s)\n",xrn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
818 printf("\tlbz %s,0(%s)\n",nrn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
819 printf("\textsb %s,%s\n",nrn,nrn);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
820 printf("\taddi %s,%s,%d\n", xrn,xrn,caddr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
821 printf("\tstw %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
822 i=creg;creg=nreg;nreg=i;
917947ffeb7c power pc version
kono
parents:
diff changeset
823 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
824 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
825 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
826 }
917947ffeb7c power pc version
kono
parents:
diff changeset
827
917947ffeb7c power pc version
kono
parents:
diff changeset
828
917947ffeb7c power pc version
kono
parents:
diff changeset
829 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
830 code_cpreinc(int e1,int e2,int reg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
831 char *xrn,*crn,*nrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
832 int i,nreg,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
833 if (car(e2)==REGISTER) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
834 printf("\tlbzu %s,%d(%s)\n",register_name(reg),caddr(e1),register_name(cadr(e2)));
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
835 printf("\textsb %s,%s\n",register_name(reg),register_name(reg));
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
836 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
837 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
838 }
917947ffeb7c power pc version
kono
parents:
diff changeset
839 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
840 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
841 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
842 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
843 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
844 nrn = register_name(nreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
845 printf("\tlwz %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
846 printf("\tlbzu %s,%d(%s)\n",nrn,caddr(e1),xrn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
847 printf("\tstw %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
848 printf("\textsb %s,%s\n",nrn,nrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
849 i=creg;creg=nreg;nreg=i;
917947ffeb7c power pc version
kono
parents:
diff changeset
850 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
851 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
852 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
853 }
917947ffeb7c power pc version
kono
parents:
diff changeset
854
917947ffeb7c power pc version
kono
parents:
diff changeset
855
917947ffeb7c power pc version
kono
parents:
diff changeset
856 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
857 code_cpostdec(int e1,int e2,int reg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
858 char *xrn,*crn,*nrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
859 int i,nreg,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
860 if (car(e2)==REGISTER) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
861 crn=register_name(reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
862 xrn=register_name(cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
863 printf("\tlbz %s,0(%s)\n",crn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
864 printf("\taddi %s,%s,%d\n",xrn,xrn,caddr(e1));
917947ffeb7c power pc version
kono
parents:
diff changeset
865 printf("\textsb %s,%s\n",crn,crn);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
866 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
867 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
868 }
917947ffeb7c power pc version
kono
parents:
diff changeset
869 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
870 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
871 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
872 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
873 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
874 nrn = register_name(nreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
875 printf("\tlwz %s,0(%s)\n",xrn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
876 printf("\tlbz %s,0(%s)\n",nrn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
877 printf("\taddi %s,%s,%d\n",xrn,xrn,caddr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
878 printf("\tstw %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
879 printf("\textsb %s,%s\n",nrn,nrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
880 i=creg;creg=nreg;nreg=i;
917947ffeb7c power pc version
kono
parents:
diff changeset
881 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
882 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
883 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
884 }
917947ffeb7c power pc version
kono
parents:
diff changeset
885
917947ffeb7c power pc version
kono
parents:
diff changeset
886
917947ffeb7c power pc version
kono
parents:
diff changeset
887 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
888 code_cpredec(int e1,int e2,int reg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
889 char *xrn,*crn,*nrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
890 int i,nreg,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
891 if (car(e2)==REGISTER) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
892 crn=register_name(reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
893 xrn=register_name(cadr(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
894 printf("\tlbzu %s,%d(%s)\n",crn,caddr(e1),xrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
895 printf("\textsb %s,%s\n",crn,crn);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
896 regv[reg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
897 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
898 }
917947ffeb7c power pc version
kono
parents:
diff changeset
899 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
900 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
901 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
902 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
903 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
904 nrn = register_name(nreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
905 printf("\tlwz %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
906 printf("\tlbzu %s,%d(%s)\n",nrn,caddr(e1),xrn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
907 printf("\tstw %s,0(%s)\n",xrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
908 printf("\textsb %s,%s\n",nrn,nrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
909 i=creg;creg=nreg;nreg=i;
917947ffeb7c power pc version
kono
parents:
diff changeset
910 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
911 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
912 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
913 }
917947ffeb7c power pc version
kono
parents:
diff changeset
914
917947ffeb7c power pc version
kono
parents:
diff changeset
915
917947ffeb7c power pc version
kono
parents:
diff changeset
916 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
917 code_return(int creg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
918 char *crn = register_name(creg);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
919 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,retcont,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
920 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,retcont,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
921 }
917947ffeb7c power pc version
kono
parents:
diff changeset
922
917947ffeb7c power pc version
kono
parents:
diff changeset
923
917947ffeb7c power pc version
kono
parents:
diff changeset
924 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
925 code_environment(int creg) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
926 /* save frame pointer */
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
927 printf("\tmr %s,r30\n",register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
928 }
917947ffeb7c power pc version
kono
parents:
diff changeset
929
917947ffeb7c power pc version
kono
parents:
diff changeset
930
917947ffeb7c power pc version
kono
parents:
diff changeset
931 void
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
932 code_bool(int e1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
933 char *xrn;
917947ffeb7c power pc version
kono
parents:
diff changeset
934 int e2,e3;
917947ffeb7c power pc version
kono
parents:
diff changeset
935 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */
917947ffeb7c power pc version
kono
parents:
diff changeset
936 xrn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
937 printf("\tli %s,0\n",xrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
938 jmp(e3=fwdlabel());
917947ffeb7c power pc version
kono
parents:
diff changeset
939 fwddef(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
940 printf("\tli %s,1\n",xrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
941 fwddef(e3);
917947ffeb7c power pc version
kono
parents:
diff changeset
942 }
917947ffeb7c power pc version
kono
parents:
diff changeset
943
917947ffeb7c power pc version
kono
parents:
diff changeset
944 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
945 code_gt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
946 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
947 }
917947ffeb7c power pc version
kono
parents:
diff changeset
948
917947ffeb7c power pc version
kono
parents:
diff changeset
949 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
950 code_ugt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
951 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
952 }
917947ffeb7c power pc version
kono
parents:
diff changeset
953
917947ffeb7c power pc version
kono
parents:
diff changeset
954 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
955 code_ge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
956 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
957 }
917947ffeb7c power pc version
kono
parents:
diff changeset
958
917947ffeb7c power pc version
kono
parents:
diff changeset
959 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
960 code_uge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
961 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
962 }
917947ffeb7c power pc version
kono
parents:
diff changeset
963
917947ffeb7c power pc version
kono
parents:
diff changeset
964 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
965 code_eq(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
966 return (cond?"eq":"ne");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
967 }
917947ffeb7c power pc version
kono
parents:
diff changeset
968
917947ffeb7c power pc version
kono
parents:
diff changeset
969 void
917947ffeb7c power pc version
kono
parents:
diff changeset
970 code_cmp_crgvar(int e1) {
917947ffeb7c power pc version
kono
parents:
diff changeset
971 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
972 char *crn = register_name(creg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
973 r = get_ptr_cache((NMTBL*)cadr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
974 printf("\tlbz %s,0(%s)\n",crn,register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
975 printf("\tcmpwi cr0,%s,0\n",crn);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
976 regv[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
977 }
917947ffeb7c power pc version
kono
parents:
diff changeset
978
917947ffeb7c power pc version
kono
parents:
diff changeset
979
917947ffeb7c power pc version
kono
parents:
diff changeset
980 void
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
981 code_cmp_crlvar(int e2) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
982 char *crn = register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
983 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
984 printf("\tlbz %s,",crn);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
985 lvar(e2);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
986 code_cmp_register(creg);
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
987 regv[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
988 }
917947ffeb7c power pc version
kono
parents:
diff changeset
989
917947ffeb7c power pc version
kono
parents:
diff changeset
990
917947ffeb7c power pc version
kono
parents:
diff changeset
991 void
917947ffeb7c power pc version
kono
parents:
diff changeset
992 code_cmp_rgvar(int e1) {
917947ffeb7c power pc version
kono
parents:
diff changeset
993 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
994 char *crn = register_name(creg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
995 r = get_ptr_cache((NMTBL*)cadr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
996 printf("\tlwz %s,0(%s)\n",crn,register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
997 code_cmp_register(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
998 regv[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
999 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1000
917947ffeb7c power pc version
kono
parents:
diff changeset
1001
917947ffeb7c power pc version
kono
parents:
diff changeset
1002 void
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1003 code_cmp_rlvar(int e2) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1004 char *crn = register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1005 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1006 printf("\tlwz %s,",crn);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1007 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1008 code_cmp_register(creg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1009 regv[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1010 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1011
917947ffeb7c power pc version
kono
parents:
diff changeset
1012
917947ffeb7c power pc version
kono
parents:
diff changeset
1013 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1014 code_cmp_register(int e2) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1015 printf("\tcmpwi cr0,%s,0\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
1016 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1017
917947ffeb7c power pc version
kono
parents:
diff changeset
1018
917947ffeb7c power pc version
kono
parents:
diff changeset
1019 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1020 ascii(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
1021 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1022 printf("\t.ascii \"");
917947ffeb7c power pc version
kono
parents:
diff changeset
1023 while(*s) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1024 if (*s=='\n')
917947ffeb7c power pc version
kono
parents:
diff changeset
1025 printf("%cn",92);
917947ffeb7c power pc version
kono
parents:
diff changeset
1026 else if (*s<' ')
917947ffeb7c power pc version
kono
parents:
diff changeset
1027 printf("%c%03o",92,*s);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1028 else if (*s=='\\')
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1029 printf("\\\\");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1030 else if (*s==34)
917947ffeb7c power pc version
kono
parents:
diff changeset
1031 printf("%c%c",92,34);
917947ffeb7c power pc version
kono
parents:
diff changeset
1032 else
917947ffeb7c power pc version
kono
parents:
diff changeset
1033 printf("%c",*s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1034 s++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1035 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1036 printf("\\0%c\n\t.align 2\n",34);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1037 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1038
917947ffeb7c power pc version
kono
parents:
diff changeset
1039 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1040 code_string(int e1,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1041 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1042 char *s,*crn;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1043 int lb;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1044 crn=register_name(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1045
917947ffeb7c power pc version
kono
parents:
diff changeset
1046 s=(char *)cadr(e1);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1047 printf(".data\t\n.cstring\n\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1048 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1049 printf("L_%d:\n",lb);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1050 ascii(s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1051 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1052 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1053 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1054 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
1055 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1056 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1057 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,lb,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1058 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1059
917947ffeb7c power pc version
kono
parents:
diff changeset
1060 #define MAX_COPY_LEN 20
917947ffeb7c power pc version
kono
parents:
diff changeset
1061
917947ffeb7c power pc version
kono
parents:
diff changeset
1062 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1063 emit_copy(int from,int to,int length,int offset,int value,int det)
917947ffeb7c power pc version
kono
parents:
diff changeset
1064 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1065 char *frn = register_name(from);
917947ffeb7c power pc version
kono
parents:
diff changeset
1066 char *trn = register_name(to);
917947ffeb7c power pc version
kono
parents:
diff changeset
1067 char *drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1068 int fix = 0;
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1069 char *memmove = "memmove";
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1070 int dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1071 drn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1072
917947ffeb7c power pc version
kono
parents:
diff changeset
1073 /* length <0 means upward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1074 switch (length) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1075 case 0: break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1076 case 1: case -1:
917947ffeb7c power pc version
kono
parents:
diff changeset
1077 printf("\tlbz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1078 printf("\tstb %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1079 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1080 case 2: case -2:
917947ffeb7c power pc version
kono
parents:
diff changeset
1081 printf("\tlhz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1082 printf("\tsth %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1083 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1084 case 4: case -4:
917947ffeb7c power pc version
kono
parents:
diff changeset
1085 printf("\tlwz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1086 printf("\tstw %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1087 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1088 default:
917947ffeb7c power pc version
kono
parents:
diff changeset
1089 if (-MAX_COPY_LEN<length && length <0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1090 for(;length<=4;length+=4,offset-=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1091 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1092 for(;length<=2;length+=2,offset-=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1093 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1094 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1095 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1096 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1097 } else if (length <=MAX_COPY_LEN) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1098 for(;length>=4;length-=4,offset+=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1099 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1100 for(;length>=2;length-=2,offset+=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1101 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1102 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1103 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1104 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1105 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1106 clear_ptr_cache();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1107 code_save_stacks();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1108 printf("\tli r5,%d\n",length);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1109 printf("\tmr r4,%s\n",frn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1110 printf("\tmr r3,%s\n",trn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1111 /* overrap must be allowed */
e537da31dce3 struct push
kono
parents: 123
diff changeset
1112 printf("\tbl L_%s$stub\n",memmove);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1113 extern_define(memmove,0,FUNCTION,1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1114 fix=0;
e537da31dce3 struct push
kono
parents: 123
diff changeset
1115 set_creg(RET_REGISTER,0);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1116 if (creg!=to) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1117 free_register(to); to = creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1118 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1119 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1120 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1121 if (value) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1122 /* creg must point top of the destination data */
917947ffeb7c power pc version
kono
parents:
diff changeset
1123 /* this code is necessary for the value of assignment or function call */
917947ffeb7c power pc version
kono
parents:
diff changeset
1124 /* otherwise we don't need this */
917947ffeb7c power pc version
kono
parents:
diff changeset
1125 if (fix) printf("\taddi %s,%s,%d\n",trn,trn,fix);
917947ffeb7c power pc version
kono
parents:
diff changeset
1126 if(creg!=to) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1127 free_register(creg); creg=to;
917947ffeb7c power pc version
kono
parents:
diff changeset
1128 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1129 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1130 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1131 regv[from]=regv[to]=regv[dreg]=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
1132 regv[creg]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
1133 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1134
917947ffeb7c power pc version
kono
parents:
diff changeset
1135 int
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1136 struct_push(int e4,int t,int arg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1137 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1138 int length,count;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1139 int dreg,sreg; char *drn,*crn,*srn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1140 g_expr(e4);
917947ffeb7c power pc version
kono
parents:
diff changeset
1141 length=size(t);
917947ffeb7c power pc version
kono
parents:
diff changeset
1142 if(length%size_of_int) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1143 length += size_of_int - (length%size_of_int);
917947ffeb7c power pc version
kono
parents:
diff changeset
1144 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1145 dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1146 drn = register_name(dreg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1147 crn = register_name(creg);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1148 if (length<MAX_COPY_LEN) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1149 sreg = get_register(); if (!sreg) error(-1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1150 srn = register_name(sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1151 code_lvar(cadr(arg),sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1152 for(count=0;length<MAX_COPY_LEN;count++,length-=size_of_int) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1153 if (length==0) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1154 free_register(sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1155 free_register(dreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1156 return count;
e537da31dce3 struct push
kono
parents: 123
diff changeset
1157 } else {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1158 printf("\tlwz %s,%d(%s)\n",drn,length-size_of_int,crn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1159 printf("\tstwu %s,%d(%s)\n",drn,-size_of_int,srn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1160 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1161 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1162 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1163 code_lvar(cadr(arg),dreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1164 /* downward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1165 emit_copy(creg,dreg,length,0,0,1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1166 if (dreg) free_register(dreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1167 return length/size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
1168 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1169
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1170 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1171 set_creg(int reg,int mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1172 {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1173 if (reg!=creg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1174 clear_ptr_cache_reg(reg);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1175 if (mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1176 printf("\tmr %s,%s\n",register_name(reg),register_name(creg));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1177 free_register(creg);
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1178 creg = reg;
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1179 regs[creg]=1;
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1180 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1181 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1182
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1183 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1184 set_freg(int reg,int mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1185 {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1186 if (reg!=freg) {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1187 if (mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1188 printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1189 free_fregister(freg);
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1190 freg = reg;
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1191 fregs[freg]=1;
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1192 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1193 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1194
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1195 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1196 use_var(int arg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1197 {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1198 if (car(arg)==REGISTER)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1199 regs[cadr(arg)]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1200 else if (car(arg)==DREGISTER)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1201 fregs[cadr(arg)]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1202 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1203
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1204 void
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1205 code_save_input_registers()
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1206 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1207 #if 0
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1208 int args;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1209 NMTBL *n;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1210 int reg;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1211 int tag;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1212 int lvar;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1213 int t;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1214 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1215 int reg_offset = 0;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1216
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1217 for(args = fnptr->dsp;args;args = cadr(args)) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1218 n = (NMTBL *)caddr(args);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1219 tag = n->sc;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1220 reg = n->dsp;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1221 if (!n||n==&null_nptr) error(REG_ERR);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1222 if (tag==REGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1223 /* regs[reg]==INPUT_REG case should be considered */
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1224 n->dsp = new_lvar(size_of_int);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1225 t = INT;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1226 reg += reg_offset; /* for duplicated floating point argument */
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1227 } else if (tag==DREGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1228 /* fregs[reg]==INPUT_REG case should be considered */
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1229 n->dsp = new_lvar(size_of_double);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1230 t = DOUBLE;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1231 reg_offset+=2;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1232 } else
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1233 continue;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1234 n->sc = LVAR;
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1235 lvar = list2(LVAR,n->dsp);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1236 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1237 if (tag==REGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1238 free_register(reg);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1239 } else if (tag==DREGISTER) {
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1240 free_fregister(reg);
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1241 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1242 }
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1243 my_func_args = 0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1244 #else
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1245 int args;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1246 NMTBL *n;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1247 int reg;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1248 int tag;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1249 int lvar;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1250 int t;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1251 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1252 int reg_offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1253 int offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1254
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1255 for(args = fnptr->dsp;args;args = cadr(args)) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1256 n = (NMTBL *)caddr(args);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1257 tag = n->sc;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1258 reg = n->dsp;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1259 if (!n||n==&null_nptr) error(REG_ERR);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1260 if (tag==REGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1261 /* regs[reg]==INPUT_REG case should be considered */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1262 n->dsp = offset;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1263 offset+=size_of_int;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1264 t = INT;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1265 reg += reg_offset; /* for duplicated floating point argument */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1266 } else if (tag==DREGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1267 /* fregs[reg]==INPUT_REG case should be considered */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1268 n->dsp = offset;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1269 t = n->ty;
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1270 if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; }
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1271 else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; }
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1272 else error(-1);
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1273 } else {
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1274 offset += size(n->ty);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1275 continue;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1276 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1277 n->sc = LVAR;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1278 lvar = list2(LVAR,n->dsp);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1279 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1280 if (tag==REGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1281 free_register(reg);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1282 } else if (tag==DREGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1283 free_fregister(reg);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1284 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1285 }
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1286 my_func_args = offset;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1287 #endif
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1288 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1289
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1290 int
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1291 simple_args(int e3)
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1292 {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1293 return
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1294 !contains_in_list(e3,FUNCTION) &&
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1295 !contains_in_list(e3,CONV) &&
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1296 !contains_in_list(e3,RSTRUCT) &&
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1297 !contains_in_list(e3,SASS)
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1298 ;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1299 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1300
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1301 int
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1302 caller_arg_offset_v(int arg)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1303 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1304 return ARG_LVAR_OFFSET+arg*size_of_int;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1305 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1306
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1307 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1308 function(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
1309 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1310 int e2,e3,e4,e5,nargs,t,r0,r1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1311 int arg,reg_arg,freg_arg,arg_assign;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1312 int reg_arg_list=0,ret_type,special_lvar;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
1313 NMTBL *fn = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1314 int jmp = 0;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1315 char *jrn;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1316
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1317 special_lvar = -1;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1318 ret_type = cadddr(e1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1319
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1320 e2 = cadr(e1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1321 if (car(e2) == FNAME) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1322 fn=(NMTBL *)cadr(e2);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1323 } else {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1324 jmp = get_register_var(0);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1325 if (car(jmp)!=REGISTER) error(-1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1326 reg_arg_list = list2(jmp,reg_arg_list);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1327 g_expr(e2);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1328 code_register(creg,cadr(jmp));
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1329 /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1330 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1331
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1332 /* now all input register vars are free */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1333 code_save_stacks();
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1334 set_creg(CREG_REGISTER,0);
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1335 set_freg(FREG_FREGISTER,0);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1336
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1337 nargs = reg_arg = freg_arg = arg_assign = 0;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1338 for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1339 t=caddr(e3);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1340 e4 = car(e3);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1341 if(scalar(t)) {
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1342 if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1343 arg = list2(LVAR,caller_arg_offset_v(nargs));
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1344 } else if (!simple_args(e3) && cadr(e3)) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1345 arg = get_register_var(0);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1346 arg_assign = list2(
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1347 assign_expr0(get_input_register_var(reg_arg,0,0),arg,t,t),
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1348 arg_assign);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1349 } else {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1350 arg = get_input_register_var(reg_arg,0,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1351 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1352 use_var(arg); /* protect from input register free */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1353 reg_arg_list = list2(arg,reg_arg_list);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1354 g_expr_u(assign_expr0(arg,e4,t,t));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1355 nargs ++ ; reg_arg++;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1356 continue;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1357 } else if (t==DOUBLE||t==FLOAT) {
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1358 if (reg_arg<MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1359 /* sigh...
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1360 printf requies floating value in integer registers
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1361 */
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1362 if (car(e4)==DRLVAR) {
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1363 special_lvar = cadr(e4);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1364 e5 = list2(LVAR,special_lvar);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1365 } else {
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1366 special_lvar = new_lvar(size_of_double);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1367 g_expr(assign_expr0(
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1368 (e5=list2(LVAR,special_lvar)),e4,t,t));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1369 reg_arg_list = list2(e5,reg_arg_list);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1370 e4 = list2(DREGISTER,freg);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1371 /* freg should not change until XXX */
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1372 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1373 r0=get_input_register_var(reg_arg,0,0);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1374 r1=get_input_register_var(reg_arg+1,0,0);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1375 use_var(r0); /* protect from input register free */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1376 use_var(r1); /* protect from input register free */
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1377 reg_arg_list = list2(r0,reg_arg_list);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1378 reg_arg_list = list2(r1,reg_arg_list);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1379 arg_assign = list2( assign_expr0(r0,e5,INT,INT), arg_assign);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1380 arg_assign = list2( assign_expr0(r1,
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1381 list2(LVAR,special_lvar+size_of_int),
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1382 INT,INT), arg_assign);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1383 reg_arg += 2;
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1384 }
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1385 if (freg_arg>=4 && freg_arg<MAX_INPUT_DREGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1386 /* oh my god!
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1387 it requies integer register and floating register and
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1388 stack value. You are crazy.
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1389 */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1390 arg_assign = list2(
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1391 assign_expr0(list2(LVAR,caller_arg_offset_v(nargs)),
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1392 get_input_fregister_var(freg_arg,0,0),t,t),
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1393 arg_assign);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1394 }
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1395 if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1396 arg = list2(LVAR,caller_arg_offset_v(nargs));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1397 } else if (!simple_args(e3)) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1398 arg = get_fregister_var(0);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1399 arg_assign = list2(
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1400 assign_expr0(get_input_fregister_var(freg_arg,0,0),arg,t,t),
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1401 arg_assign);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1402 } else {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1403 arg = get_input_fregister_var(freg_arg,0,0);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1404 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1405 use_var(arg); /* protect from input register free */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1406 reg_arg_list = list2(arg,reg_arg_list);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1407 g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1408 freg_arg++;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1409 nargs += size(t)/size_of_int;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1410 continue;
917947ffeb7c power pc version
kono
parents:
diff changeset
1411 } else if (car(t)==STRUCT||car(t)==UNION) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1412 arg = list2(LVAR,caller_arg_offset_v(nargs));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1413 nargs += struct_push(e4,t,arg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1414 continue;
917947ffeb7c power pc version
kono
parents:
diff changeset
1415 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1416 error(TYERR);
917947ffeb7c power pc version
kono
parents:
diff changeset
1417 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1418 ++nargs;
917947ffeb7c power pc version
kono
parents:
diff changeset
1419 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1420 if (max_func_args<nargs) max_func_args=nargs;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1421 for(;arg_assign;arg_assign=cadr(arg_assign)) {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1422 g_expr_u(car(arg_assign));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1423 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1424 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1425 if (car(e2) == FNAME) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1426 printf("\tbl\tL_%s$stub\n",fn->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1427 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1428 jrn = register_name(cadr(jmp));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1429 printf("\tmtctr %s\n",jrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1430 printf("\tbctrl\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1431 }
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1432 for(;reg_arg_list;reg_arg_list=cadr(reg_arg_list)) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1433 arg = car(reg_arg_list);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1434 if (car(arg)==DREGISTER) free_fregister(cadr(arg));
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1435 else if (car(arg)==REGISTER) free_register(cadr(arg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1436 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1437 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1438 if (ret_type==DOUBLE||ret_type==FLOAT) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1439 set_freg(RET_FREGISTER,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1440 fregv[freg]=1; regv[creg]=0;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1441 } else if (ret_type==VOID) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1442 fregv[freg]=0; regv[creg]=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1443 } else {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1444 set_creg(RET_REGISTER,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1445 fregv[freg]=0; regv[creg]=1;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1446 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1447 return ret_type;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1448 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1449
917947ffeb7c power pc version
kono
parents:
diff changeset
1450 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1451 code_frame_pointer(int e3) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1452 printf("\tmr r30,%s\n",register_name(e3));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1453 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1454
917947ffeb7c power pc version
kono
parents:
diff changeset
1455
917947ffeb7c power pc version
kono
parents:
diff changeset
1456 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1457 code_fix_frame_pointer(int disp_offset) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1458 printf("\tla r1,%d(r30)\n",disp_offset);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1459 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1460
917947ffeb7c power pc version
kono
parents:
diff changeset
1461 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1462 code_jmp(char *s) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1463 printf("\tb L_%s$stub\n",s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1464 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1465
917947ffeb7c power pc version
kono
parents:
diff changeset
1466
917947ffeb7c power pc version
kono
parents:
diff changeset
1467 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1468 code_indirect_jmp(int e2) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1469 printf("\tmtctr %s\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
1470 printf("\tbctr\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1471 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1472
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1473 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1474 rindirect(int e1) /* *(p +5 ) */
917947ffeb7c power pc version
kono
parents:
diff changeset
1475 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1476 char *crn;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1477 int e2,e3,e4,offset;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1478
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1479 offset=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1480 e3 = cadr(e2 = cadr(e1));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1481 if (car(e2)==ADD) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1482 e4=caddr(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1483 if (car(e4)==CONST) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1484 offset=cadr(e4);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1485 e2=e3;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1486 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1487 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1488 g_expr(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1489 crn=register_name(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1490 switch (car(e1)) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1491 case FRINDIRECT: case DRINDIRECT:
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1492 printf("\t%s %s,%d(%s)\n",fload(car(e1)==DRINDIRECT),
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1493 fregister_name(freg),offset,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1494 regv[creg]=0; regv[freg]=1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1495 return DOUBLE;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1496 case CRINDIRECT:
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1497 printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1498 printf("\textsb %s,%s\n",crn,crn);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1499 return CHAR;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1500 case RINDIRECT:
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1501 printf("\tlwz %s,%d(%s)\n",crn,offset,crn);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1502 return INT;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1503 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1504 error(-1); return INT;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1505 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1506
917947ffeb7c power pc version
kono
parents:
diff changeset
1507 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1508 code_assign_gvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1509 int r;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1510 char *crn,*rrn;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1511 r = get_ptr_cache((NMTBL*)cadr(e2));
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1512 rrn=register_name(r);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1513 crn=register_name(creg);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1514 if (byte) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1515 printf("\tstb %s,0(%s)\n",crn,rrn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1516 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1517 printf("\tstw %s,0(%s)\n",crn,rrn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1518 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1519 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1520
917947ffeb7c power pc version
kono
parents:
diff changeset
1521 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1522 code_assign_lvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1523 char *crn;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1524 crn=register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1525 lvar_intro(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1526 if (byte) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1527 printf("\tstb %s,",crn); lvar(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1528 } else {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1529 printf("\tstw %s,",crn); lvar(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1530 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1531 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1532
917947ffeb7c power pc version
kono
parents:
diff changeset
1533 void
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1534 code_assign_register(int e2,int byte,int creg) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1535 if (e2!=creg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1536 printf("\tmr %s,%s\n",register_name(e2),register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1537 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1538
917947ffeb7c power pc version
kono
parents:
diff changeset
1539 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1540 code_assign(int e2,int byte,int creg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1541 char *drn=register_name(e2);
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1542 char *crn=register_name(creg);
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1543
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1544 if (byte) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1545 printf("\tstb %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1546 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1547 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1548 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1549 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1550
917947ffeb7c power pc version
kono
parents:
diff changeset
1551
917947ffeb7c power pc version
kono
parents:
diff changeset
1552 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1553 code_register_assop(int e2,int op,int byte) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1554 int reg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1555 int xreg = creg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1556 creg = reg = e2;
917947ffeb7c power pc version
kono
parents:
diff changeset
1557 tosop(op,xreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1558 creg = xreg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1559 if (creg!=reg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1560 printf("\tmr %s,%s\n",register_name(creg),register_name(reg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1561 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1562
917947ffeb7c power pc version
kono
parents:
diff changeset
1563
917947ffeb7c power pc version
kono
parents:
diff changeset
1564 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1565 code_assop(int op,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1566 char *xrn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1567 int xreg;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1568 int edx = get_register(); if(!edx) error(-1);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1569 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1570 regv[xreg]=regs[xreg]=1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1571 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1572 regv[edx]=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
1573 ld_indexx(byte,0,edx);
917947ffeb7c power pc version
kono
parents:
diff changeset
1574 tosop(op,xreg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1575 crn = register_name(creg);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1576 drn = register_name(edx);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1577 if (byte) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1578 printf("\tstb %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1579 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1580 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1581 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1582 free_register(edx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1583 emit_pop_free(xreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1584 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1585
917947ffeb7c power pc version
kono
parents:
diff changeset
1586
917947ffeb7c power pc version
kono
parents:
diff changeset
1587 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1588 tosop(int op,int oreg)
917947ffeb7c power pc version
kono
parents:
diff changeset
1589 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1590 int dx;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1591 char *orn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1592
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1593 if(oreg==-1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1594 error(-1);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1595 } else if (oreg<= -REG_LVAR_OFFSET) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1596 dx = get_register(); if (dx<0) error(-1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1597 code_rlvar(oreg+REG_LVAR_OFFSET,dx);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1598 oreg = dx;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1599 regv[oreg]=1;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1600 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1601
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1602 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1603 case LSHIFT:
917947ffeb7c power pc version
kono
parents:
diff changeset
1604 case ULSHIFT:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1605 shift("slw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1606 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1607 case RSHIFT:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1608 shift("srw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1609 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1610 case URSHIFT:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1611 shift("sraw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1612 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1613 }
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1614 orn = register_name(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1615 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1616 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1617 case ADD:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1618 printf("\tadd %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1619 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1620 case SUB:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1621 printf("\tsub %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1622 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1623 case CMP:
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1624 printf("\tcmpw cr0,%s,%s\n",crn,orn);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1625 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1626 case BAND:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1627 printf("\tand %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1628 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1629 case EOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1630 printf("\txor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1631 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1632 case BOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1633 printf("\tor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1634 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1635 case MUL:
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1636 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1637 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1638 case UMUL:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1639 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1640 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1641 case DIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1642 printf("\tdivw %s,%s,%s\n",crn,crn,orn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1643 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1644 case UDIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1645 printf("\tdivwu %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1646 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1647 case MOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1648 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1649 drn = register_name(dx);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1650 printf("\tdivw %s,%s,%s\n",drn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1651 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1652 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1653 free_register(dx);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1654 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1655 case UMOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1656 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1657 drn = register_name(dx);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1658 printf("\tdivwu %s,%s,%s\n",drn,crn,orn);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1659 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1660 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1661 free_register(dx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1662 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1663 default:
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1664 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1665 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1666 if(oreg!=creg) free_register(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1667 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1668
917947ffeb7c power pc version
kono
parents:
diff changeset
1669
917947ffeb7c power pc version
kono
parents:
diff changeset
1670 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1671 shift(char *op, int reg)
917947ffeb7c power pc version
kono
parents:
diff changeset
1672 {
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1673 char *crn = register_name(creg);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1674 char *rrn = register_name(reg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1675 printf("\t%s %s,%s,%s\n",op,crn,rrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1676 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1677
917947ffeb7c power pc version
kono
parents:
diff changeset
1678 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1679 ld_indexx(int byte, int n, int xreg)
917947ffeb7c power pc version
kono
parents:
diff changeset
1680 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1681 char *crn = register_name(creg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1682 if (byte) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1683 printf("\tlbz %s,%d(%s)\n",register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1684 register_name(xreg));
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1685 printf("\textsb %s,%s\n",crn,crn);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1686 } else
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1687 printf("\tlwz %s,%d(%s)\n",register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1688 register_name(xreg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1689 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1690
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1691 int
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1692 code_csvalue()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1693 {
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1694 return creg;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1695 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1696
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1697 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1698 code_cmpdimm(int e, int csreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1699 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1700 /* used in dosiwtch() */
917947ffeb7c power pc version
kono
parents:
diff changeset
1701 if(chk) return;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1702 printf("\tcmpwi cr0,%s,%d\n",register_name(csreg),e);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1703 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1704
917947ffeb7c power pc version
kono
parents:
diff changeset
1705 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1706 code_opening(char *filename)
917947ffeb7c power pc version
kono
parents:
diff changeset
1707 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1708 printf("\t.file \"%s\"\n",filename);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1709 /* printf("\t.version\t\"01.01\"\n"); */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1710 /* printf("gcc2_compiled.:\n"); */
917947ffeb7c power pc version
kono
parents:
diff changeset
1711 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1712 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1713
917947ffeb7c power pc version
kono
parents:
diff changeset
1714 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1715 rexpr(int e1, int l1, char *s,int t)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1716 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1717 g_expr(list3(CMP,cadr(e1),caddr(e1)));
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1718 printf("\tb%s cr0,L_%d\n",s,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1719 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1720
917947ffeb7c power pc version
kono
parents:
diff changeset
1721
917947ffeb7c power pc version
kono
parents:
diff changeset
1722 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1723 jcond(int l, char cond)
917947ffeb7c power pc version
kono
parents:
diff changeset
1724 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1725 if (chk) return;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1726 printf("\tb%s cr0,L_%d\n",cond?"ne":"eq",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1727 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1728
917947ffeb7c power pc version
kono
parents:
diff changeset
1729 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1730 jmp(int l)
917947ffeb7c power pc version
kono
parents:
diff changeset
1731 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1732 control=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
1733 if (chk) return;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1734 printf("\tb\tL_%d\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1735 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1736
917947ffeb7c power pc version
kono
parents:
diff changeset
1737 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1738 gen_comment(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
1739 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1740 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1741 printf("## %s",s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1742 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1743
917947ffeb7c power pc version
kono
parents:
diff changeset
1744 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1745 code_enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
1746 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1747 if (output_mode!=TEXT_EMIT_MODE)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1748 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1749 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1750 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1751 if (stmode!=STATIC)
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1752 printf(".globl _%s\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1753 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1754 printf("\t.type\t%s,@function\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1755 #endif
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
1756 printf("_%s:\n",name);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1757 code_disp_label=fwdlabel();
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1758 printf("\tstwu r1,lo16(L_%d)(r30)\n",code_disp_label);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1759 printf("\tbcl 20,31,L_%d\n",code_base = fwdlabel());
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1760 fwddef(code_base);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1761 printf("\tmflr r31\n");
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1762 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1763 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1764
917947ffeb7c power pc version
kono
parents:
diff changeset
1765
917947ffeb7c power pc version
kono
parents:
diff changeset
1766 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1767 code_enter1(int args)
917947ffeb7c power pc version
kono
parents:
diff changeset
1768 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1769 printf("## args %d disp %d code_arg_offset=%d code_disp_offset=%d\n",args,disp,code_arg_offset,code_disp_offset);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
1770 set_creg(CREG_REGISTER,0);
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
1771 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1772 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1773
917947ffeb7c power pc version
kono
parents:
diff changeset
1774 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1775 code_leave(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
1776 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1777 disp&= -size_of_int;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1778 printf(".set L_%d,%d\n",code_disp_label,disp+code_disp_offset);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1779 local_table();
917947ffeb7c power pc version
kono
parents:
diff changeset
1780 labelno++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1781 free_all_register();
917947ffeb7c power pc version
kono
parents:
diff changeset
1782 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1783
917947ffeb7c power pc version
kono
parents:
diff changeset
1784 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1785 enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
1786 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1787 if (output_mode!=TEXT_EMIT_MODE)
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1788 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1789 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1790 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1791 if (stmode!=STATIC)
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
1792 printf(".globl _%s\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1793 /*
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1794 printf("\t.type\t%s,@function\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1795 */
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
1796 printf("_%s:\n",name);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1797 code_setup=fwdlabel();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1798 printf("\tmflr r0\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1799 printf("\tbl L_%d\n",code_setup);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1800 code_base=fwdlabel();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1801 fwddef(code_base);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1802 r1_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1803 lvar_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1804 printf("\tstwu r1,lo16(-L_%d)(r1)\n",r1_offset_label);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1805 printf("\tmr r30,r1\n");
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1806 printf("\tmflr r31\n");
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1807 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1808 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1809
917947ffeb7c power pc version
kono
parents:
diff changeset
1810 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1811 enter1()
917947ffeb7c power pc version
kono
parents:
diff changeset
1812 {
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
1813 set_creg(CREG_REGISTER,0);
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
1814 set_freg(FREG_FREGISTER,0);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1815 }
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1816
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1817 int
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1818 reg_save_offset()
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1819 {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1820 return -(
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1821 (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int+
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1822 (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_double
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1823 );
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1824 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1825
917947ffeb7c power pc version
kono
parents:
diff changeset
1826 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1827 leave(int control, char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
1828 {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1829
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1830 if (control) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1831 code_set_return_register(1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1832 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1833 if (retcont) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1834 if (control) jmp(retlabel);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1835 fwddef(retcont);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1836 printf("\tmr r1,r30\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1837 if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1838 printf("\tfmr f1,f31\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1839 } else if (cadr(fnptr->ty)!=VOID) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1840 printf("\tmr r3,r29\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1841 }
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1842 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1843 fwddef(retlabel);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1844 printf("\tlwz r1,0(r1)\n");
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1845 if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1846 reg_save = reg_save_offset();
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1847 if (max_freg_var>=0) {
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1848 printf("\tlmw r%d,%d(r1)\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1849 REG_VAR_BASE-max_reg_var,reg_save);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1850 freg_save = 72-(REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*4;
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1851 printf("\tb restFP+%d ; restore f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1852 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1853 FREG_VAR_BASE-max_freg_var);
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1854 } else {
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1855 printf("\tlwz r0,8(r1)\n");
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1856 printf("\tmtlr r0\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1857 printf("\tlmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1858 REG_VAR_BASE-max_reg_var,reg_save);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1859 printf("\tblr\n");
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1860 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1861
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1862 disp &= -size_of_int;
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1863 fwddef(code_setup);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1864 printf("\tstmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1865 REG_VAR_BASE-max_reg_var,reg_save);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1866 printf("\tstw r0,8(r1)\n");
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1867 if (max_freg_var>=0)
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1868 printf("\tb saveFP+%d ; save f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1869 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1870 FREG_VAR_BASE-max_freg_var);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1871 else {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1872 printf("\tblr\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1873 }
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1874
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1875 code_offset_set();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1876 local_table();
917947ffeb7c power pc version
kono
parents:
diff changeset
1877 labelno++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1878 free_all_register();
917947ffeb7c power pc version
kono
parents:
diff changeset
1879 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1880
917947ffeb7c power pc version
kono
parents:
diff changeset
1881
917947ffeb7c power pc version
kono
parents:
diff changeset
1882 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1883 code_set_return_register(int mode) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1884 if (cadr(fnptr->ty)==DOUBLE||cadr(fnptr->ty)==FLOAT) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1885 set_freg(RET_FREGISTER,mode);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1886 } else {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1887 set_creg(RET_REGISTER,mode);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1888 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1889 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1890
917947ffeb7c power pc version
kono
parents:
diff changeset
1891 void
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1892 code_set_fixed_creg(int mode,int type) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1893 if (type==FLOAT||type==DOUBLE) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1894 if (cond_freg== -1) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1895 cond_freg = get_fregister_var(0);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1896 if(car(cond_freg)!=DREGISTER) error(-1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1897 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1898 set_freg(cadr(cond_freg),mode);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1899 } else {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1900 if (cond_reg== -1) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1901 cond_reg = get_register_var(0);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1902 if(car(cond_reg)!=REGISTER) error(-1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1903 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1904 set_creg(cadr(cond_reg),mode);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1905 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1906 }
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1907
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1908 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1909 gen_gdecl(char *n, int gpc)
917947ffeb7c power pc version
kono
parents:
diff changeset
1910 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1911 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1912 if (stmode!=STATIC)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1913 printf(".globl _%s\n",n);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1914 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1915 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1916
917947ffeb7c power pc version
kono
parents:
diff changeset
1917 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1918 align(int t)
917947ffeb7c power pc version
kono
parents:
diff changeset
1919 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1920 if (t!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1921 if (data_alignment & 1)
917947ffeb7c power pc version
kono
parents:
diff changeset
1922 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1923 data_alignment = 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
1924 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1925 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1926
917947ffeb7c power pc version
kono
parents:
diff changeset
1927 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1928 emit_data(int e, int t, NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
1929 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1930 int l;
917947ffeb7c power pc version
kono
parents:
diff changeset
1931 double d;
917947ffeb7c power pc version
kono
parents:
diff changeset
1932 float f;
917947ffeb7c power pc version
kono
parents:
diff changeset
1933 char *name;
917947ffeb7c power pc version
kono
parents:
diff changeset
1934 name = n->nm;
917947ffeb7c power pc version
kono
parents:
diff changeset
1935 if(mode!=GDECL) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1936 error(-1); return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1937 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1938 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1939 if (n->dsp != -1) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1940 n->dsp = -1; /* initiallized flag */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1941 printf(".globl\t_%s\n",name);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1942 data_mode(name);
917947ffeb7c power pc version
kono
parents:
diff changeset
1943 align(t);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1944 printf("_%s:\n",name);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1945 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1946 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
1947 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1948 if(car(e)==CONST) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1949 if (t==CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1950 printf("\t.byte %d\n",cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
1951 if (data_alignment>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1952 data_alignment++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1953 gpc += 1;
917947ffeb7c power pc version
kono
parents:
diff changeset
1954 } else if (t==SHORT) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1955 printf("\t.word %d\n",cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
1956 if (data_alignment>0) data_alignment++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1957 gpc += 2;
917947ffeb7c power pc version
kono
parents:
diff changeset
1958 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1959 printf("\t.long %d\n",cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
1960 gpc += size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
1961 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1962 } else if(t==DOUBLE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1963 d = dcadr(e);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1964 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1965 } else if(t==FLOAT) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1966 f = dcadr(e);
917947ffeb7c power pc version
kono
parents:
diff changeset
1967 printf("\t.long\t0x%x\n",*(int *)&f);
917947ffeb7c power pc version
kono
parents:
diff changeset
1968 } else if(t!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1969 gpc += size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
1970 if(car(e)==ADDRESS&&car(cadr(e))==GVAR) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1971 printf("\t.long _%s\n",((NMTBL *)cadr(cadr(e)))->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1972 } else if(car(e)==FNAME) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1973 printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1974 } else if(car(e)==GVAR) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1975 printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1976 } else if(car(e)==STRING) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1977 if (car(n->ty)!=ARRAY || cadr(n->ty)!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1978 l = fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1979 printf("\t.long L_%d\n",l);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1980 printf(".cstring\n\t.align 2\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1981 printf("L_%d:\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1982 output_mode = RODATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
1983 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1984 ascii((char *)cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
1985 } else error(TYERR);
917947ffeb7c power pc version
kono
parents:
diff changeset
1986 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1987 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1988
917947ffeb7c power pc version
kono
parents:
diff changeset
1989 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1990 emit_data_closing(NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
1991 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1992 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1993 int lb;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1994 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1995 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1996 if (mode==GDECL) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1997 data_mode(0);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1998 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1999 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2000 printf("L_%d:\n",lb);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2001 printf("\t.size\t%s,L_%d-%s\n",n->nm,lb,n->nm);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2002 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2003 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2004 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2005
917947ffeb7c power pc version
kono
parents:
diff changeset
2006 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2007 global_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2008 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2009 NMTBL *n;
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2010 int init; char *extrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2011 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2012 for(n=ntable;n < &ntable[GSYMS];n++) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2013 if ((n->sc == GVAR) && n->dsp != -1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2014 /* n->dsp = -1 means initialized global */
917947ffeb7c power pc version
kono
parents:
diff changeset
2015 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2016 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
2017 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
2018 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2019 printf(".comm _%s,%d\n",n->nm,size(n->ty));
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2020 } else if ((n->sc==STATIC) && n->dsp != -1) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2021 /* n->dsp = -1 means initialized global */
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2022 if (init==0) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2023 data_mode(0);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2024 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2025 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2026 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2027 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2028 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2029 for(n=ntable;n < &ntable[GSYMS];n++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2030 if (is_code(n)||is_function(n)) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2031 extrn = n->nm;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2032 if (n->sc==EXTRN1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2033 data_mode(0);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2034 printf(".picsymbol_stub\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2035 printf("L_%s$stub:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2036 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2037 printf("\tmflr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2038 printf("\tbcl 20,31,L0$_%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2039 printf("L0$_%s:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2040 printf("\tmflr r11\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2041 printf("\taddis r11,r11,ha16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2042 printf("\tmtlr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2043 printf("\tlwz r12,lo16(L_%s$lazy_ptr-L0$_%s)(r11)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2044 printf("\tmtctr r12\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2045 printf("\taddi r11,r11,lo16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2046 printf("\tbctr\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2047 printf(".data\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2048 printf(".lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2049 printf("L_%s$lazy_ptr:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2050 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2051 printf("\t.long dyld_stub_binding_helper\n");
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2052 } else if (n->sc==FUNCTION||n->sc==CODE) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2053 text_mode();
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2054 printf("\t.set L_%s$stub,_%s\n",extrn,extrn);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2055 data_mode(0);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2056 printf("L_%s$non_lazy_ptr:\n\t.long\t_%s\n",extrn,extrn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2057 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2058 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2059 }
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2060 init=0;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2061 for(n=ntable;n < &ntable[GSYMS];n++) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2062 if (n->sc == GVAR) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2063 if (init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2064 printf(".data\n");
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2065 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2066 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2067 printf("L_%s$non_lazy_ptr:\n\t.long\t_%s\n",n->nm,n->nm);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2068 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2069 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2070 init = 0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2071 for(n=ntable;n < &ntable[GSYMS];n++) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2072 if (is_code(n)||is_function(n)) continue;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2073 if (n->sc==EXTRN1) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2074 if(init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2075 printf(".data\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2076 printf(".non_lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2077 init=1;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2078 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2079 printf("L_%s$non_lazy_ptr:\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2080 printf("\t.indirect_symbol _%s\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2081 printf("\t.long\t0\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2082 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2083 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2084 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2085
917947ffeb7c power pc version
kono
parents:
diff changeset
2086 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2087 local_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2088 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2089 NMTBL *n;
917947ffeb7c power pc version
kono
parents:
diff changeset
2090 int init;
917947ffeb7c power pc version
kono
parents:
diff changeset
2091 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2092 /* static local variables */
917947ffeb7c power pc version
kono
parents:
diff changeset
2093 for(n=ntable+GSYMS;n < &ntable[GSYMS+LSYMS];n++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2094 if (n->sc == GVAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2095 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2096 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
2097 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
2098 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2099 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2100 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2101 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2102 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2103
917947ffeb7c power pc version
kono
parents:
diff changeset
2104 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2105 text_mode(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2106 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2107 if (output_mode!=TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2108 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2109 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2110 output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
2111 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2112 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2113
917947ffeb7c power pc version
kono
parents:
diff changeset
2114 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2115 data_mode(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2116 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2117 if (output_mode!=DATA_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2118 printf(".data\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2119 output_mode = DATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
2120 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2121 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2122 if (name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2123 printf("\t.type\t%s,@object\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2124 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2125 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2126
917947ffeb7c power pc version
kono
parents:
diff changeset
2127 /* floating point */
917947ffeb7c power pc version
kono
parents:
diff changeset
2128
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2129 static int float_one_lib_used=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2130 static char *float_one_lib[] = {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2131 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2132 /* ".literal8", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2133 " .align 3",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2134 "__float_one:",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2135 " .long 1065353216",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2136 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2137 /* ".set L__float_one$non_lazy_ptr,__float_one", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2138 0
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2139 };
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2140 static int float_zero_lib_used=0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2141 static char *float_zero_lib[] = {
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2142 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2143 /* ".literal8", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2144 " .align 3",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2145 "__float_zero:",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2146 " .long 0",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2147 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2148 /* ".set L__float_zero$non_lazy_ptr,__float_zero", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2149 0
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2150 };
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2151
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2152
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2153
917947ffeb7c power pc version
kono
parents:
diff changeset
2154 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
2155 fstore(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2156 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2157 return (d?"stfd":"stfs");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2158 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2159
917947ffeb7c power pc version
kono
parents:
diff changeset
2160 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
2161 fload(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2162 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2163 return d?"lfd":"lfs";
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2164 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2165
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2166 void
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2167 code_cmp_fregister(int e2)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2168 {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2169 char *frn,*rrn,*grn;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2170 int greg,r;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2171 grn = register_name(greg = get_fregister());
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2172 frn = register_name(freg);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2173 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2174 r = get_ptr_cache(&float_zero);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2175 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2176 printf("\tlfs %s,0(%s)\n",grn,rrn);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2177 printf("\tfcmpu cr0,%s,%s\n",grn,frn);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2178 free_fregister(greg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2179 fregv[freg]=0;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2180 return;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2181 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2182
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2183 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2184 code_fregister(int e2,int freg)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2185 {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2186 if (freg!=e2)
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2187 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2188 fregv[freg]=1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2189 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2190
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2191 void code_dassign_gvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2192 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2193 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2194 r = get_ptr_cache((NMTBL*)cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2195 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(r));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2196 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2197 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2198
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2199 void code_dassign_lvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2200 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2201 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2202 printf("\t%s %s,",fstore(d),fregister_name(freg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2203 lvar(e2);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2204 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2205 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2206
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2207 void code_dassign(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2208 {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2209 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(e2));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2210 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2211 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2212
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2213 void
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2214 code_dassign_fregister(int e2,int d,int freg) {
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2215 if (e2!=freg)
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2216 printf("\tfmr %s,%s\n",fregister_name(e2),fregister_name(freg));
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2217 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2218
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2219 static double d0 = 1.0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2220
917947ffeb7c power pc version
kono
parents:
diff changeset
2221 int
917947ffeb7c power pc version
kono
parents:
diff changeset
2222 code_d1(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2223 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2224 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2225 return (i[1] == 0x3ff00000)?j[0]:j[1];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2226 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2227
917947ffeb7c power pc version
kono
parents:
diff changeset
2228 int
917947ffeb7c power pc version
kono
parents:
diff changeset
2229 code_d2(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2230 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2231 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2232 return (i[1] == 0x3ff00000)?j[1]:j[0];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2233 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2234
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2235 void code_dconst(int e2,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2236 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2237 int lb;
917947ffeb7c power pc version
kono
parents:
diff changeset
2238 double d = dcadr(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2239 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2240 char *rrn,*frn;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2241 frn = fregister_name(freg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2242 if (d==0.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2243 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2244 r = get_ptr_cache(&float_zero);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2245 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2246 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2247 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2248 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2249 if (d==1.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2250 float_one_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2251 r = get_ptr_cache(&float_one);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2252 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2253 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2254 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2255 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2256 rrn = register_name((r=get_register()));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2257 printf(" \t.data\n\t.align 3\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2258 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2259 printf("L_%d:\n",lb);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2260 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2261 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2262 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2263 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
2264 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
2265 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2266 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",rrn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2267 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",rrn,lb,code_base,rrn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2268 printf("\tlfd %s,0(%s)\n",frn,rrn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2269 free_register(r);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2270 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2271 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2272
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2273 void code_dneg(int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2274 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2275 char *frn = fregister_name(freg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2276 printf("\tfneg %s,%s\n",frn,frn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2277 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2278
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2279 void code_d2i(int freg,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2280 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2281 char *frn = fregister_name(freg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2282 char *crn = register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2283 int e2 = new_lvar(size_of_double);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2284 free_lvar(e2);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2285 printf("\tfctiwz %s,%s\n",frn,frn);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2286 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2287 printf("\tstfd %s,",frn); lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2288 lvar_intro(e2+size_of_double-size_of_int);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2289 printf("\tlwz %s,",crn); lvar(e2+size_of_double-size_of_int);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2290 fregs[freg]=0;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2291 regs[creg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2292 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2293
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2294 static int i2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2295 static char *i2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2296 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2297 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2298 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2299 "__i2dLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2300 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2301 " .long -2147483648",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2302 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2303 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2304 "i2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2305 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2306 " bcl 20,31,__i2dL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2307 "__i2dL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2308 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2309 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2310 " xoris r3,r3,0x8000",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2311 " stw r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2312 " lis r0,0x4330",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2313 " stw r0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2314 " lfd f0,-32(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2315 " addis r9,r10,ha16(__i2dLC0-__i2dL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2316 " lfd f1,lo16(__i2dLC0-__i2dL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2317 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2318 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2319 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2320 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2321
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2322 void code_i2d(int creg,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2323 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2324 i2d_lib_used = 1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2325 clear_ptr_cache();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2326 code_save_stacks();
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2327 set_creg(RET_REGISTER,1);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2328 printf("\tbl i2d_\n");
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2329 set_freg(RET_FREGISTER,0);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2330 fregs[freg]=1;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2331 regs[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2332 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2333
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2334 static int d2u_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2335 static char *d2u_lib[] = {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2336 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2337 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2338 "__d2uLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2339 " .long 1105199104",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2340 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2341 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2342 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2343 "d2u_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2344 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2345 " bcl 20,31,__d2uL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2346 "__d2uL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2347 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2348 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2349 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2350 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2351 " fcmpu cr0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2352 " cror 2,1,2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2353 " beq- cr0,__d2uL2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2354 " fctiwz f0,f1",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2355 " stfd f0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2356 " lwz r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2357 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2358 "__d2uL2:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2359 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2360 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2361 " fsub f0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2362 " fctiwz f0,f0",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2363 " stfd f0,-24(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2364 " lwz r3,-20(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2365 " xoris r3,r3,0x8000",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2366 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2367 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2368 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2369
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2370 void code_d2u(int freg,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2371 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2372 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2373 clear_ptr_cache();
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2374 d2u_lib_used=1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2375 set_freg(RET_FREGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2376 printf("\tbl d2u_\n");
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2377 set_creg(RET_REGISTER,0);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2378 fregs[freg]=1;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2379 regs[creg]=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2380 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2381
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2382 static int u2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2383 static char *u2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2384 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2385 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2386 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2387 "__u2dLC1:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2388 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2389 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2390 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2391 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2392 "u2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2393 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2394 " bcl 20,31,__u2dL2$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2395 "__u2dL2$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2396 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2397 " mtlr r0",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2398 " stw r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2399 " lis r0,0x4330",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2400 " stw r0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2401 " lfd f0,-32(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2402 " addis r9,r10,ha16(__u2dLC1-__u2dL2$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2403 " lfd f1,lo16(__u2dLC1-__u2dL2$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2404 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2405 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2406 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2407 };
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2408
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2409 void code_u2d(int creg,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2410 {
115
ebac635814dc fix nested macro function
kono
parents: 114
diff changeset
2411 char *frn;
ebac635814dc fix nested macro function
kono
parents: 114
diff changeset
2412 char *crn;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2413 u2d_lib_used = 1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2414 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2415 clear_ptr_cache();
115
ebac635814dc fix nested macro function
kono
parents: 114
diff changeset
2416 frn = fregister_name(freg);
ebac635814dc fix nested macro function
kono
parents: 114
diff changeset
2417 crn = register_name(creg);
ebac635814dc fix nested macro function
kono
parents: 114
diff changeset
2418
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2419 printf("\tmr r3,%s\n",crn);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2420 printf("\tbl u2d_\n");
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2421 printf("\tfmr %s,f1\n",frn);
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2422 fregs[freg]=1;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2423 regs[creg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2424 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2425
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2426 void code_drgvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2427 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2428 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2429 r = get_ptr_cache((NMTBL*)cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2430 printf("\t%s %s,0(%s)\n",fload(d),fregister_name(freg),register_name(r));
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2431 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2432 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2433
917947ffeb7c power pc version
kono
parents:
diff changeset
2434
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2435 void code_drlvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2436 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2437 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2438 printf("\t%s %s,",fload(d),fregister_name(freg)); lvar(e2);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2439 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2440 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2441
917947ffeb7c power pc version
kono
parents:
diff changeset
2442 void code_cmp_drgvar(int e2)
917947ffeb7c power pc version
kono
parents:
diff changeset
2443 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2444 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2445 char *frn=fregister_name(freg);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2446 int g=get_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2447 char *grn=fregister_name(g);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2448 r = get_ptr_cache((NMTBL*)cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2449 printf("\t%s %s,0(%s)\n",fload(1),grn,register_name(r));
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2450 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2451 free_fregister(g);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2452 fregv[freg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2453 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2454
917947ffeb7c power pc version
kono
parents:
diff changeset
2455 void code_cmp_drlvar(int e2)
917947ffeb7c power pc version
kono
parents:
diff changeset
2456 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2457 char *frn=fregister_name(freg);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2458 int g=get_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2459 char *grn=fregister_name(g);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2460
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2461 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2462 printf("\t%s %s,",fload(1),grn); lvar(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2463 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2464 free_fregister(g);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2465 fregv[freg]=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2466 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2467
917947ffeb7c power pc version
kono
parents:
diff changeset
2468 void dtosop(int op,int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2469 {
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2470 char *opn="";
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2471 char *frn=fregister_name(freg);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2472 char *grn=fregister_name(e1);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2473 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2474 switch(op) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2475 case DADD: opn="fadd"; break;
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2476 case DSUB: opn="fsub"; break;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2477 case DDIV: opn="fdiv"; break;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2478 case DMUL: opn="fmul"; break;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2479 case DCMP:
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2480 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2481 free_fregister(e1);
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2482 return;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2483 case DCMPGE:
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2484 printf("\tfcmpu cr7,%s,%s\n",frn,grn);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2485 free_fregister(e1);
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2486 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2487 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2488 printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2489 free_fregister(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2490 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2491
917947ffeb7c power pc version
kono
parents:
diff changeset
2492 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2493 code_dassop(int op,int d) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2494 /* we have lvalue in creg, applied floating value is in freg */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2495 char *frn=fregister_name(freg);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2496 int xreg=emit_dpop(0);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2497 char *crn=register_name(creg);
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2498
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2499 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2500 dtosop(op,xreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2501 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2502 emit_dpop_free(xreg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2503 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2504 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2505
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2506
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2507 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2508 code_dpreinc(int e1,int e2,int d,int reg) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2509 char *frn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2510 char *crn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2511 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2512 char *grn,*drn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2513 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2514 r = get_ptr_cache(&float_one);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2515 float_one_lib_used=1;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2516
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2517 g_expr(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2518
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2519 crn=register_name(creg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2520 frn=fregister_name(freg);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2521 drn=register_name(r);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2522 grn=fregister_name(g=get_fregister());
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2523
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2524 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2525 printf("\tlfs %s,0(%s)\n",grn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2526 if (caddr(e1)>0)
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2527 printf("\tfadd %s,%s,%s\n",frn,frn,grn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2528 else
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2529 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2530 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2531 free_fregister(g);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2532 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2533 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2534
917947ffeb7c power pc version
kono
parents:
diff changeset
2535 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2536 code_dpostinc(int e1,int e2,int d,int reg) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2537 char *frn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2538 char *crn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2539 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2540 char *grn,*drn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2541 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2542 r = get_ptr_cache(&float_one);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2543 float_one_lib_used=1;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2544
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2545 g_expr(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2546
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2547 crn=register_name(creg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2548 frn=fregister_name(freg);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2549 drn=register_name(r);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2550 grn=fregister_name(g=get_fregister());
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2551
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2552 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2553 printf("\tlfs %s,0(%s)\n",grn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2554 if (caddr(e1)>0)
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2555 printf("\tfadd %s,%s,%s\n",grn,frn,grn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2556 else
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2557 printf("\tfsub %s,%s,%s\n",grn,frn,grn);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2558 printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2559 free_fregister(g);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2560 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2561 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2562
917947ffeb7c power pc version
kono
parents:
diff changeset
2563 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2564 drexpr(int e1, int e2,int l1, int op)
917947ffeb7c power pc version
kono
parents:
diff changeset
2565 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2566 g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2567 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2568 case DOP+GE:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2569 printf("\tcror 2,29,30\n");
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2570 printf("\tbne\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2571 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2572 case DOP+GT:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2573 printf("\tble\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2574 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2575 case DOP+EQ:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2576 printf("\tbne\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2577 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2578 case DOP+NEQ:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2579 printf("\tbeq\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2580 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2581 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2582 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2583
917947ffeb7c power pc version
kono
parents:
diff changeset
2584 int emit_dpop(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2585 {
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2586 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2587 xreg=pop_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2588 if (xreg<= -REG_LVAR_OFFSET) {
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2589 reg = get_fregister();
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2590 code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
2591 free_lvar(REG_LVAR_OFFSET+xreg);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2592 fregv[reg]=1; xreg=reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2593 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2594 return xreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2595 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2596
917947ffeb7c power pc version
kono
parents:
diff changeset
2597 void emit_dpop_free(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2598 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2599 free_fregister(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2600 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2601
917947ffeb7c power pc version
kono
parents:
diff changeset
2602 void emit_dpush()
917947ffeb7c power pc version
kono
parents:
diff changeset
2603 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2604 int new_reg;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2605 if (freg_sp>MAX_MAX) error(-1);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2606 new_reg = get_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2607 freg_stack[freg_sp++] = freg; /* push するかわりにレジスタを使う */
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2608 freg = new_reg;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2609 fregv[freg]=1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2610 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2611
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2612 void
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2613 code_save_stacks()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2614 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2615 int i,reg;
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2616 for(i=0;i<reg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2617 if ((reg=reg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2618 code_assign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2619 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2620 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2621 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2622 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2623 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2624 if ((reg=freg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2625 code_dassign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2626 (freg_stack[i]=new_lvar(size_of_double)),reg,1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2627 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2628 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2629 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2630 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2631
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2632 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2633 emit_lib(char *p[])
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2634 {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2635 while(*p) {
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2636 printf("%s\n",*p++);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2637 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2638 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2639
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2640 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2641 code_closing()
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2642 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2643 if (d2u_lib_used) emit_lib(d2u_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2644 if (u2d_lib_used) emit_lib(u2d_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2645 if (float_one_lib_used) emit_lib(float_one_lib);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2646 if (float_zero_lib_used) emit_lib(float_zero_lib);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2647 if (i2d_lib_used) emit_lib(i2d_lib);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2648 global_table();
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2649 /* printf("\t.ident \"Micro-C compiled\"\n"); */
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2650 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2651
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2652 /* end */
917947ffeb7c power pc version
kono
parents:
diff changeset
2653