annotate mc-code-powerpc.c @ 209:7bfc1435cdc6 regv-fix

regv fix done
author kono
date Wed, 21 Apr 2004 17:40:29 +0900 (2004-04-21)
parents 70b1da1864f6
children f21651f85344
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
173
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
9 char *l_include_path[] = {
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
10 "/usr/include/",
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
11 0
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
12 };
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
13
89
917947ffeb7c power pc version
kono
parents:
diff changeset
14 #define TEXT_EMIT_MODE 0
917947ffeb7c power pc version
kono
parents:
diff changeset
15 #define DATA_EMIT_MODE 1
917947ffeb7c power pc version
kono
parents:
diff changeset
16 #define RODATA_EMIT_MODE 2
917947ffeb7c power pc version
kono
parents:
diff changeset
17
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
18 static void data_mode(char *name);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
19 static void init_ptr_cache();
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
20 static void ld_indexx(int byte, int n, int xreg,int sign);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
21 static void local_table(void);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
22 static void shift(char *op, int reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
23 static int struct_push(int e4,int t,int arg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
24
89
917947ffeb7c power pc version
kono
parents:
diff changeset
25 static int output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
26 static int data_alignment = 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
27
917947ffeb7c power pc version
kono
parents:
diff changeset
28 static int code_disp_label;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
29 static int code_setup;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
30 static int r1_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
31 static int lvar_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
32
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
33 static int reg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
34 static int freg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
35
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
36 static int freg,ireg,lreg;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
37
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
38 int size_of_int = 4;
165
kono
parents: 164
diff changeset
39 int size_of_short = 2;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
40 int size_of_float = 4;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
41 int size_of_double = 8;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
42 int size_of_longlong = 8;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
43 int endian = 1;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
44
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
45 static int reg_sp; /* REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
46 static int reg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
47
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
48 /* floating point registers */
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
49
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
50 static int freg_sp; /* floating point REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
51 static int freg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
52
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
53 static int lreg_sp; /* longlong REGister Stack-Pointer */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
54 static int lreg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
55
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
56 #define REG_fp 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
57 #define REG_sp 30
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
58 #define REG_VAR_BASE 29
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
59 #define REG_VAR_MIN 18
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
60 #define MIN_TMP_REG 3
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
61 #define MAX_TMP_REG 11
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
62
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
63 #define PTRC_REG 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
64
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
65 #define FREG_VAR_BASE 31
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
66 #define FREG_VAR_MIN 20
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
67 #define MIN_TMP_FREG 1
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
68 #define MAX_TMP_FREG 14
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
69
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
70 int MAX_REGISTER=30; /* PowerPC�Υ쥸������10�ĤޤǻȤ�*/
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
71 int MAX_FREGISTER=31;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
72 #define REAL_MAX_REGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
73 #define REAL_MAX_FREGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
74 #define REAL_MAX_LREGISTER 16
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
75
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
76 #define FREG_OFFSET REAL_MAX_REGISTER
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
77 #define LREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
78
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
79 #define RET_REGISTER 3
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
80 #define RET_FREGISTER (1+FREG_OFFSET)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
81 #define RET_LREGISTER_L 4 /* low word */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
82 #define RET_LREGISTER_H 3 /* high word */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
83 #define RET_LREGISTER LREG_OFFSET
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
84
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
85 int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
86 int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
87 int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
88 int MAX_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
89 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
90 int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
91
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
92 static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
93 REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
94 static int regv_h0[REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
95 static int regv_l0[REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
96 #define regv_h(i) regv_h0[i-LREG_OFFSET]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
97 #define regv_l(i) regv_l0[i-LREG_OFFSET]
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
98
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
99 static int *regs = powerpc_regs;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
100
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
101 #define CREG_REGISTER (MAX_TMP_REG)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
102 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
103 #define LREG_LREGISTER (MAX_TMP_REG+LREG_OFFSET)
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
104
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
105
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
106 static int max_reg_var, max_freg_var;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
107
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
108 static char *reg_name[] = {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
109 "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
110 "r10","r11","r12","r13","r14","r15","r16","r17","r18","r19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
111 "r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
112 "r30","r31",
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
113 "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
114 "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
115 "f20","f21","f22","f23","f24","f25","f26","f27","f28","f29",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
116 "f30","f31"
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
117 };
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
118
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
119 #define register_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
120 #define fregister_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
121 #define lregister_name_low(i) reg_name[regv_l(i)]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
122 #define lregister_name_high(i) reg_name[regv_l(i)]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
123
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
124 #define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
125 #define is_float_reg(i) (REAL_MAX_REGISTER<=i&&i<REAL_MAX_FREGISTER+REAL_MAX_REGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
126 #define is_longlong_reg(i) (LREG_OFFSET<=i&&i<LREG_OFFSET+REAL_MAX_LREGISTER)
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
127
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
128
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
129 int use_int(int i) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
130 if (!is_int_reg(i)) {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
131 if (lreg) { free_register(lreg); lreg = 0; }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
132 if (!ireg) ireg = get_register();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
133 else if (ireg!=i) free_register(i);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
134 i = ireg;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
135 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
136 if (!regs[i]) regs[i]=USING_REG;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
137 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
138 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
139
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
140 int use_float(int i) {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
141 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
142 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
143 if (!freg) freg = get_dregister(0);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
144 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
145 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
146 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
147 if (!regs[i]) regs[i]=USING_REG;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
148 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
149 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
150
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
151 int use_double(int i) {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
152 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
153 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
154 if (!freg) freg = get_dregister(1);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
155 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
156 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
157 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
158 if (!regs[i]) regs[i]=USING_REG;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
159 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
160 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
161
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
162 int use_longlong(int i) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
163 if (!is_longlong_reg(i)) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
164 if (!lreg) lreg = get_lregister();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
165 else if (lreg!=i) free_register(i);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
166 i = lreg;
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
167 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
168 if (!regs[i]) regs[i]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
169 if (!regs[regv_l(i)]) regs[regv_l(i)]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
170 if (!regs[regv_h(i)]) regs[regv_h(i)]=USING_REG;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
171 return i;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
172 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
173
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
174
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
175 #if FLOAT_CODE
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
176 static
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
177 NMTBL float_zero = {"_float_zero",STATIC,FLOAT,0};
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
178 static
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
179 NMTBL float_one = {"_float_one",STATIC,FLOAT,0};
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
180
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
181
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
182 static char * fload(int d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
183 static int code_d1(double d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
184 static int code_d2(double d);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
185 #endif
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
186 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
187 static int code_l1(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
188 static int code_l2(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
189 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
190
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
191 static void code_save_stacks();
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
192 static void code_save_input_registers();
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
193 static void clear_ptr_cache_reg(int r);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
194 static void set_ireg(int,int);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
195 static void set_freg(int,int);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
196 static void set_lreg(int,int);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
197
153
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
198 static int max_func_args;
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
199 static int my_func_args;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
200 #define ARG_LVAR_OFFSET 0x10000000
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
201
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
202 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
203
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
204 r0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
205 r3-r10 input register
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
206 r22-r29 saved register variable (input register for code segement)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
207 r30 stack pointer
917947ffeb7c power pc version
kono
parents:
diff changeset
208 r31 0
917947ffeb7c power pc version
kono
parents:
diff changeset
209 r1 frame pointer
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
210
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
211 f0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
212 f1-r8 input register
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
213 f24-f31 saved register variable
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
214
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
215 function call stack frame
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
216 <------r1_offset------------------------------>
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
217 <------------lvar_offset------->
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
218 r+ +------------+---+---------------+----------+--------------+----+ -
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
219 callee arg xx register save local caller arg xx
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
220 reg_save disp max_func_args*size_of_int
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
221 lvar>0 lvar<0 lvar>0x1000 0000
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
222
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
223 code segment stack frame
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
224
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
225 * goto��ƤӽФ����ؿ���r1 ! r1(goto����r1)
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
226 # * r30 <---r1_offset---------> r1
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
227 r+ +----------+--+----------+----------------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
228 cousin arg xx reg save !callee arg !code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
229 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
230 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
231 *size_of_int *size_of_int
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
232
89
917947ffeb7c power pc version
kono
parents:
diff changeset
233 */
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
234 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
235 #define func_disp_offset 60
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
236 #define r1_offset func_disp_offset+12
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
237 int code_disp_offset = 0; int jump_offset = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
238 #define CODE_LVAR l+code_disp_offset
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
239 #define CODE_CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
240 #define FUNC_LVAR l+disp_offset
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
241 #define CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
242 #define CALLEE_ARG l+arg_offset
89
917947ffeb7c power pc version
kono
parents:
diff changeset
243
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
244 void
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
245 code_offset_set()
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
246 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
247 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
248 int l;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
249 #endif
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
250 int lvar_offsetv = -disp+max_func_args*size_of_int+func_disp_offset;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
251 int r1_offsetv = -disp+max_func_args*size_of_int-reg_save+r1_offset;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
252 printf(".set L_%d,%d\n",lvar_offset_label,lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
253 printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
254 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
255 printf("# function %s\n",fnptr->nm);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
256 l = ARG_LVAR_OFFSET;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
257 printf("# offset call0\t%d\n",CALLER_ARG);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
258 l = ARG_LVAR_OFFSET+max_func_args*size_of_int;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
259 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
260 l = disp;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
261 printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
262 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
263 printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
264 l = -reg_save;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
265 printf("# offset regs\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
266 printf("# offset r1off\t%d\n",r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
267 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
268 printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
269 l = my_func_args;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
270 printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
271 #endif
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
272 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
273
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
274
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
275 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
276 lvar8(int l)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
277 {
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
278 if (fnptr->sc==CODE) {
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
279 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
280 printf("lo16(%d)(r1)\n",CODE_CALLER_ARG);
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
281 } else
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
282 printf("lo16(%d)(r30)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
283 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
284 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
285 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
286 printf("lo16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
287 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
288 printf("lo16(%d+L_%d)(r30)\n",CALLEE_ARG,r1_offset_label);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
289 }
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
290 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
291
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
292 /* if size of local variables / input variables is more then 64k,
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
293 lo16 does not work. We have to use ha16 also. But we can't know
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
294 the exact size in one path compile. We may safely use lvar16ha
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
295 if disp or max_func_args > 32k. Of course this is reduantant for
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
296 smaller offset. But who cares who use very large local variables?
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
297 */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
298
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
299 #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
300
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
301 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
302 lvar16ha(int l)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
303 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
304 if (fnptr->sc==CODE) {
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
305 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
306 printf("la r0,ha16(%d)(r1)\n",CODE_CALLER_ARG);
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
307 } else
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
308 printf("la r0,ha16(%d)(r30)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
309 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
310 printf("la r0,ha16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
311 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
312 if (CALLER_ARG>32765)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
313 printf("la r0,ha16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
314 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
315 printf("la r0,ha16(%d+L_%d)(r30)\n",CALLEE_ARG,r1_offset_label);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
316 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
317 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
318
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
319 static void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
320 lvar16lo(int l)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
321 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
322 if (fnptr->sc==CODE) {
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
323 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
324 printf("lo16(%d)(r0)\n",CODE_CALLER_ARG);
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
325 } else
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
326 printf("lo16(%d)(r0)\n",CODE_LVAR);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
327 } else if (l<0) { /* local variable */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
328 printf("lo16(%d+L_%d)(r0)\n",FUNC_LVAR,lvar_offset_label);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
329 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
330 if (CALLER_ARG>32765)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
331 printf("lo16(%d)(r0)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
332 else
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
333 printf("lo16(%d)(r30)\n",CALLER_ARG);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
334 } else { /* callee's arguments */
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
335 printf("lo16(%d+L_%d)(r0)\n",CALLEE_ARG,r1_offset_label);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
336 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
337 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
338
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
339 #define lvar_intro(i) if (LARGE_LVAR) lvar16ha(i)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
340
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
341 #define lvar(i) if (LARGE_LVAR) lvar16lo(i); else lvar8(i)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
342
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
343 void
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
344 code_lvar(int e2,int creg) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
345 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
346 printf("\tla %s,",register_name(creg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
347 lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
348 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
349
89
917947ffeb7c power pc version
kono
parents:
diff changeset
350 void
917947ffeb7c power pc version
kono
parents:
diff changeset
351 code_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
352 {
173
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
353 macro_define("__ppc__ 1\n");
177
352feeae4b0a macro else/ccout
kono
parents: 173
diff changeset
354 macro_define("__BIG_ENDIAN__ 1\n");
182
e1e9ec8c96a7 some fix
kono
parents: 178
diff changeset
355 // macro_define("_BSD_CT_RUNE_T_ int\n");
185
427008a06333 comment
kono
parents: 182
diff changeset
356 macro_define("__STDC__ 1\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
357 init_ptr_cache();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
358 regv_l(RET_LREGISTER) = RET_LREGISTER_L;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
359 regv_h(RET_LREGISTER) = RET_LREGISTER_H;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
360 }
917947ffeb7c power pc version
kono
parents:
diff changeset
361
917947ffeb7c power pc version
kono
parents:
diff changeset
362 void
917947ffeb7c power pc version
kono
parents:
diff changeset
363 gexpr_code_init(void){
172
096559f07a70 some check
kono
parents: 168
diff changeset
364 #if 0
096559f07a70 some check
kono
parents: 168
diff changeset
365 int new_reg,old_reg,dm;
096559f07a70 some check
kono
parents: 168
diff changeset
366 /* register shuffling */
096559f07a70 some check
kono
parents: 168
diff changeset
367 if (is_int_reg(creg)) {
096559f07a70 some check
kono
parents: 168
diff changeset
368 dm = get_register();
096559f07a70 some check
kono
parents: 168
diff changeset
369 new_reg = get_register();
096559f07a70 some check
kono
parents: 168
diff changeset
370 old_reg = creg;
096559f07a70 some check
kono
parents: 168
diff changeset
371 ireg = creg = new_reg;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
372 free_register(old_reg);
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
373 free_register(dm);
172
096559f07a70 some check
kono
parents: 168
diff changeset
374 } else if (is_float_reg(creg)) {
096559f07a70 some check
kono
parents: 168
diff changeset
375 dm = get_dregister(1);
096559f07a70 some check
kono
parents: 168
diff changeset
376 new_reg = get_dregister(1);
096559f07a70 some check
kono
parents: 168
diff changeset
377 old_reg = creg;
096559f07a70 some check
kono
parents: 168
diff changeset
378 freg = creg = new_reg;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
379 free_register(old_reg);
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
380 free_register(dm);
172
096559f07a70 some check
kono
parents: 168
diff changeset
381 }
096559f07a70 some check
kono
parents: 168
diff changeset
382 #endif
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
383 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
384
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
385 void
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
386 code_gexpr(int e){
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
387 // if (is_int_reg(creg) && creg!=ireg) error(-1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
388 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
389
89
917947ffeb7c power pc version
kono
parents:
diff changeset
390
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
391 void
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
392 code_arg_register(NMTBL *fnptr)
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
393 {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
394 int args = fnptr->dsp;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
395 NMTBL *n;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
396 int reg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
397 int freg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
398 int type;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
399 int reg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
400 int i;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
401 int is_code0 = is_code(fnptr);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
402
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
403 while (args) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
404 /* process in reverse order */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
405 n = (NMTBL*)caddr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
406 type = n->ty;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
407 if (scalar(type)) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
408 if ((reg = get_input_register_var(reg_var,n,is_code0))) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
409 n->sc = REGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
410 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
411 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
412 reg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
413 cadddr(args)=size_of_int;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
414 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
415 } else if (type==FLOAT) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
416 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
417 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
418 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
419 regs[n->dsp]= INPUT_REG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
420 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
421 cadddr(args)=size(type);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
422 }
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
423 } else if (type==DOUBLE) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
424 if ((reg = get_input_dregister_var(freg_var,n,is_code0,1))) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
425 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
426 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
427 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
428 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
429 cadddr(args)=size(type);
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
430 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
431 } else if (type==LONGLONG||type==ULONGLONG) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
432 if ((reg = get_input_lregister_var(reg_var,n,is_code0))) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
433 n->sc = LREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
434 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
435 regs[i=n->dsp]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
436 regs[regv_l(i)]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
437 regs[regv_h(i)]= INPUT_REG;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
438 reg_var+=2;
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
439 cadddr(args)=size(type);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
440 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
441 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
442 args = cadr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
443 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
444 if (is_function(fnptr))
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
445 code_save_input_registers();
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
446 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
447
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
448
89
917947ffeb7c power pc version
kono
parents:
diff changeset
449 int
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
450 get_register0(void)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
451 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
452 int i,reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
453 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
454 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
455 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
456 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
457 }
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
458 /* PTR_CACHE ��Ĥ֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
459 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
460 if (regs[i]==PTRC_REG) {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
461 clear_ptr_cache_reg(i);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
462 } else
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
463 continue;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
464 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
465 return i; /* ���ξ���ɽ���ֹ���֤� */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
466 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
467 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
468 for(i=0;i<reg_sp;i++) {
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
469 if ((reg=reg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
470 code_assign_lvar(
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
471 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
472 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
473 return reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
474 }
917947ffeb7c power pc version
kono
parents:
diff changeset
475 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
476 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
477 /* search register stack */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
478 for(i=0;i<lreg_sp;i++) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
479 if ((reg=lreg_stack[i])>=0) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
480 code_assign_lvar(
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
481 (lreg_stack[i]=new_lvar(size_of_longlong)),reg,0);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
482 lreg_stack[i]= lreg_stack[i]-REG_LVAR_OFFSET;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
483 free_register(reg);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
484 return get_register();
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
485 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
486 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
487 #endif
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
488 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
489 reg =REG_VAR_BASE-i;
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
490 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
491 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
492 if (i>max_reg_var) max_reg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
493 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
494 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
495 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
496 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
497 error(HPERR); return creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
498 }
917947ffeb7c power pc version
kono
parents:
diff changeset
499
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
500 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
501 get_register(void)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
502 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
503 int i = get_register0();
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
504 printf("# get_register %d\n",i);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
505 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
506 }
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
507
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
508 int
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
509 pop_register(void)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
510 { /* �쥸���������ͤ���Ф� */
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
511 return reg_stack[--reg_sp];
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
512 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
513
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
514 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
515 int
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
516 get_dregister0(int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
517 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
518 int i,reg;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
519 for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
520 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
521 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
522 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
523 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
524 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
525 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
526 if ((reg=freg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
527 code_dassign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
528 (freg_stack[i]=new_lvar(size_of_double)),reg,1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
529 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
530 return reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
531 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
532 }
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
533 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
534 reg =FREG_VAR_BASE-i+FREG_OFFSET;
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
535 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
536 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
537 if (i>max_freg_var) max_freg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
538 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
539 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
540 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
541 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
542 error(REG_ERR); return freg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
543 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
544
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
545
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
546 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
547 get_dregister(int d)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
548 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
549 int i = get_dregister0(d);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
550 printf("# get_dregister %d\n",i);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
551 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
552 }
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
553
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
554 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
555 pop_fregister(void)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
556 { /* �쥸���������ͤ���Ф� */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
557 return freg_stack[--freg_sp];
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
558 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
559 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
560
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
561 int
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
562 get_lregister0()
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
563 {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
564 int i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
565 for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
566 if (regs[i]==0) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
567 printf("# get_lregister %d\n",i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
568 return i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
569 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
570 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
571 return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
572 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
573
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
574 int
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
575 get_lregister()
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
576 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
577 int h,l,i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
578 i = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
579 if (i==-1) return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
580 if (regs[i]==0) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
581 h = get_register();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
582 if (h==-1) return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
583 regv_h(i) = h;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
584 l = get_register();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
585 if (l==-1) { free_register(h); return -1; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
586 regv_l(i) = l;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
587 regs[i]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
588 return i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
589 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
590 return -1;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
591 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
592
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
593 int
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
594 get_lregister_var(NMTBL *n)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
595 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
596 int i,j,ll;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
597 int max_reg_var_save=max_reg_var;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
598 ll = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
599 if (ll==-1) return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
600 if (regs[ll]==0) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
601 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
602 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
603 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
604 regs[REG_VAR_BASE-i]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
605 if (i>max_reg_var) max_reg_var=i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
606 for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
607 if (! regs[REG_VAR_BASE-j]) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
608 /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
609 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
610 regs[REG_VAR_BASE-j]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
611 if (j>max_reg_var) max_reg_var=j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
612 /* ���ξ���ɽ���ֹ���֤� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
613 regv_l(ll) = REG_VAR_BASE-j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
614 regv_h(ll) = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
615 return list3(LREGISTER,ll,(int)n);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
616 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
617 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
618 /* �ҤȤĤ����ʤ��ä� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
619 regs[REG_VAR_BASE-i]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
620 max_reg_var=max_reg_var_save;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
621 goto not_found;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
622 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
623 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
624 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
625 not_found:
204
4c614334f3d0 long long test parse
kono
parents: 203
diff changeset
626 return list2(LVAR,new_lvar(size_of_longlong));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
627 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
628
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
629 void
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
630 emit_pop_free(int xreg)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
631 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
632 if (xreg>=0)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
633 free_register(xreg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
634 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
635
89
917947ffeb7c power pc version
kono
parents:
diff changeset
636 void
917947ffeb7c power pc version
kono
parents:
diff changeset
637 free_register(int i) { /* ����ʤ��ʤä��쥸�������� */
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
638 printf("# free_register %d\n",i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
639 regs[i]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
640 if (is_longlong_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
641 regs[regv_l(i)]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
642 regs[regv_h(i)]=0;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
643 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
644 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
645
89
917947ffeb7c power pc version
kono
parents:
diff changeset
646 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
647 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
648 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
649 if (is_code) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
650 if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
651 i = FREG_VAR_BASE-i+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
652 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
653 if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
654 i = i+MIN_TMP_FREG+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
655 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
656 return list3(DREGISTER,i,(int)n);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
657 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
658
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
659 int
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
660 get_input_lregister_var(int i,NMTBL *n,int is_code)
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
661 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
662 int ll;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
663 ll = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
664 if (i!=-1) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
665 if (is_code) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
666 if(!(i+1<REG_VAR_BASE-REG_VAR_MIN)) return 0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
667 i = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
668 } else {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
669 if (i<0||i+1>=MAX_INPUT_REGISTER_VAR) return 0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
670 i = i+MIN_TMP_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
671 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
672 regv_l(ll)=i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
673 regv_h(ll)=i+1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
674 } else { error(-1); ll=LREG_OFFSET+2; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
675 return list3(LREGISTER,ll,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
676 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
677
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
678 int
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
679 get_input_register_var(int i,NMTBL *n,int is_code)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
680 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
681 if (is_code) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
682 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
683 i = REG_VAR_BASE-i;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
684 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
685 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
686 i = i+MIN_TMP_REG;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
687 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
688 return list3(REGISTER,i,(int)n);
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
689 }
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
690
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
691 /* double register case? */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
692
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
693 int
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
694 get_input_register_var_1(int i,NMTBL *n,int is_code)
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
695 {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
696 if (is_code) {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
697 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
698 i = REG_VAR_BASE-i;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
699 } else {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
700 if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
701 i = i+MIN_TMP_REG;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
702 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
703 return list3(REGISTER,i,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
704 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
705
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
706 int
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
707 free_register_count(int d)
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
708 {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
709 int i,count,fcount;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
710 fcount = count = 0;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
711 for(i=0;i<MAX_REGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
712 if (! regs[i]) count++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
713 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
714 for(i=0;i<MAX_FREGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
715 if (! regs[i+FREG_OFFSET]) fcount++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
716 }
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
717 printf("# free reg %d freg %d\n",count,fcount);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
718 return d?fcount:count;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
719 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
720
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
721 #if 0
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
722 static int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
723 register_full(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
724 {
917947ffeb7c power pc version
kono
parents:
diff changeset
725 int i;
917947ffeb7c power pc version
kono
parents:
diff changeset
726 for(i=0;i<MAX_REGISTER;i++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
727 if (! regs[i]) {
917947ffeb7c power pc version
kono
parents:
diff changeset
728 return 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
729 }
917947ffeb7c power pc version
kono
parents:
diff changeset
730 }
917947ffeb7c power pc version
kono
parents:
diff changeset
731 return 1;
917947ffeb7c power pc version
kono
parents:
diff changeset
732 }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
733 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
734
917947ffeb7c power pc version
kono
parents:
diff changeset
735 void
917947ffeb7c power pc version
kono
parents:
diff changeset
736 free_all_register(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
737 {
917947ffeb7c power pc version
kono
parents:
diff changeset
738 int i;
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
739 #if 1
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
740 printf("# free_all register\n");
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
741 #endif
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
742 #if LONGLONG_CODE
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
743 for(i=0;i<REAL_MAX_LREGISTER;i++) { regs[i+LREG_OFFSET]=0; }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
744 lreg = 0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
745 set_lreg(LREG_LREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
746 #endif
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
747 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
748 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
749 #if FLOAT_CODE
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
750 freg = get_dregister(1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
751 set_freg(FREG_FREGISTER,0);
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
752 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
753 ireg = creg = get_register();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
754 set_ireg(CREG_REGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
755 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
756 }
917947ffeb7c power pc version
kono
parents:
diff changeset
757
917947ffeb7c power pc version
kono
parents:
diff changeset
758 void
917947ffeb7c power pc version
kono
parents:
diff changeset
759 register_usage(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
760 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
761 #if 1
89
917947ffeb7c power pc version
kono
parents:
diff changeset
762 int i;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
763 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
764 if (chk) return;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
765 if (!lsrc) return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
766 printf("# %d: %s:",lineno,s);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
767 if (ireg) printf(" creg=%s",register_name(ireg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
768 if (freg) printf(" freg=%s",fregister_name(freg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
769 if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg),
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
770 lregister_name_low(lreg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
771 #if 1
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
772 printf("\n# regs:");
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
773 for(i=0;i<MAX_REGISTER;i++) { printf("%d ",regs[i]); }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
774 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
775 for(i=reg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
776 if(reg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
777 printf(" %s",register_name(reg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
778 }
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
779 printf("\n# freg:");
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
780 for(i=0;i<MAX_FREGISTER;i++) { printf("%d ",regs[i+FREG_OFFSET]); }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
781 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
782 for(i=freg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
783 if(freg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
784 printf(" %s",fregister_name(freg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
785 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
786 printf("\n# lreg:");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
787 for(i=0;i<REAL_MAX_LREGISTER;i++) { printf("%d ",regs[i+LREG_OFFSET]); }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
788 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
789 for(i=lreg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
790 if(lreg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
791 printf(" %s",lregister_name_high(lreg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
792 printf(",%s",lregister_name_low(lreg_stack[i]));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
793 }
917947ffeb7c power pc version
kono
parents:
diff changeset
794 #endif
917947ffeb7c power pc version
kono
parents:
diff changeset
795 printf("\n");
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 void
917947ffeb7c power pc version
kono
parents:
diff changeset
799 gexpr_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
800 {
917947ffeb7c power pc version
kono
parents:
diff changeset
801 while(reg_sp > 0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
802 free_register(reg_stack[--reg_sp]);
917947ffeb7c power pc version
kono
parents:
diff changeset
803 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
804 while(freg_sp > 0) {
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
805 free_register(freg_stack[--freg_sp]);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
806 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
807 while(lreg_sp > 0) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
808 free_register(lreg_stack[--lreg_sp]);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
809 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
810 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
811 gexpr_code_init();
917947ffeb7c power pc version
kono
parents:
diff changeset
812 register_usage("gexpr_init");
917947ffeb7c power pc version
kono
parents:
diff changeset
813 }
917947ffeb7c power pc version
kono
parents:
diff changeset
814
917947ffeb7c power pc version
kono
parents:
diff changeset
815
917947ffeb7c power pc version
kono
parents:
diff changeset
816 void
917947ffeb7c power pc version
kono
parents:
diff changeset
817 emit_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
818 {
917947ffeb7c power pc version
kono
parents:
diff changeset
819 free_all_register();
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
820 max_reg_var=-1; max_freg_var=-1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
821 reg_sp = 0;
123
5f180dc8d84e intel fix.
kono
parents: 122
diff changeset
822 freg_sp = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
823 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
824 }
917947ffeb7c power pc version
kono
parents:
diff changeset
825
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
826
89
917947ffeb7c power pc version
kono
parents:
diff changeset
827 int
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
828 get_register_var(NMTBL *n)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
829 {
917947ffeb7c power pc version
kono
parents:
diff changeset
830 int i;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
831 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
832 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
833 /* ���Υ쥸������Ȥ����Ȥ������ */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
834 regs[REG_VAR_BASE-i]=USING_REG;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
835 if (i>max_reg_var) max_reg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
836 /* ���ξ���ɽ���ֹ���֤� */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
837 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
838 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
839 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
840 return list2(LVAR,new_lvar(size_of_int));
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
841 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
842
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
843 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
844 get_dregister_var(NMTBL *n,int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
845 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
846 int i;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
847 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
848 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
849 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*���Υ쥸������Ȥ����Ȥ������*/
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
850 if (i>max_freg_var) max_freg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
851 /* ���ξ���ɽ���ֹ���֤� */
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
852 return list3(DREGISTER,
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
853 FREG_VAR_BASE-i+FREG_OFFSET,(int)n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
854 }
917947ffeb7c power pc version
kono
parents:
diff changeset
855 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
856 return list2(LVAR,new_lvar(size_of_double));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
857 }
917947ffeb7c power pc version
kono
parents:
diff changeset
858
917947ffeb7c power pc version
kono
parents:
diff changeset
859 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
860 emit_push()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
861 {
917947ffeb7c power pc version
kono
parents:
diff changeset
862 int new_reg;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
863 if (reg_sp>MAX_MAX) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
864 new_reg = get_register();
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
865 reg_stack[reg_sp++] = creg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
866 ireg = creg = new_reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
867 }
917947ffeb7c power pc version
kono
parents:
diff changeset
868
917947ffeb7c power pc version
kono
parents:
diff changeset
869 int
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
870 emit_pop(int type)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
871 {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
872 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
873 xreg=pop_register();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
874 if (xreg<= -REG_LVAR_OFFSET) {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
875 reg = get_register();
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
876 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
877 free_lvar(REG_LVAR_OFFSET+xreg);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
878 xreg = reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
879 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
880 return xreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
881 }
917947ffeb7c power pc version
kono
parents:
diff changeset
882
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
883 static int code_base;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
884
917947ffeb7c power pc version
kono
parents:
diff changeset
885 #define MAX_PTR_CACHE 10
917947ffeb7c power pc version
kono
parents:
diff changeset
886
917947ffeb7c power pc version
kono
parents:
diff changeset
887 int ptr_cache=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
888
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
889 void
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
890 init_ptr_cache()
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
891 {
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
892 int i;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
893 for(i=0;i<MAX_PTR_CACHE;i++) {
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
894 ptr_cache=glist3(0,ptr_cache,0);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
895 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
896 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
897
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
898 void
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
899 clear_ptr_cache_reg(int r)
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
900 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
901 int ptcptr=ptr_cache;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
902 while(ptcptr) {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
903 if(car(ptcptr)&&caddr(ptcptr)==r) {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
904 car(ptcptr)=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
905 caddr(ptcptr)=0;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
906 free_register(r);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
907 return;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
908 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
909 ptcptr=cadr(ptcptr);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
910 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
911 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
912
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
913 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
914 clear_ptr_cache()
917947ffeb7c power pc version
kono
parents:
diff changeset
915 {
917947ffeb7c power pc version
kono
parents:
diff changeset
916 int ptcptr=ptr_cache;
917947ffeb7c power pc version
kono
parents:
diff changeset
917 while(ptcptr) {
917947ffeb7c power pc version
kono
parents:
diff changeset
918 if(car(ptcptr))
917947ffeb7c power pc version
kono
parents:
diff changeset
919 free_register(caddr(ptcptr));
917947ffeb7c power pc version
kono
parents:
diff changeset
920 car(ptcptr)=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
921 caddr(ptcptr)=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
922 ptcptr=cadr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
923 }
917947ffeb7c power pc version
kono
parents:
diff changeset
924 }
917947ffeb7c power pc version
kono
parents:
diff changeset
925
917947ffeb7c power pc version
kono
parents:
diff changeset
926
917947ffeb7c power pc version
kono
parents:
diff changeset
927 int
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
928 get_ptr_cache(NMTBL *nptr)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
929 {
917947ffeb7c power pc version
kono
parents:
diff changeset
930 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
931 int ptcptr=ptr_cache;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
932 int g = (int)nptr;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
933 int p,p1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
934 char *rrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
935
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
936 p1 = ptcptr; p = cadr(p1); /* unnecesary, if ptcptr is initialized */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
937 while(ptcptr) {
917947ffeb7c power pc version
kono
parents:
diff changeset
938 if(car(ptcptr)==g) return caddr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
939 p1=p; p=ptcptr;
917947ffeb7c power pc version
kono
parents:
diff changeset
940 ptcptr=cadr(ptcptr);
917947ffeb7c power pc version
kono
parents:
diff changeset
941 }
917947ffeb7c power pc version
kono
parents:
diff changeset
942 cadr(p1)=0; /* remove the last one */
917947ffeb7c power pc version
kono
parents:
diff changeset
943 cadr(p) = ptr_cache; /* connect current queue to the last one */
917947ffeb7c power pc version
kono
parents:
diff changeset
944 ptr_cache = p; /* now the last one is the top */
917947ffeb7c power pc version
kono
parents:
diff changeset
945 if (!caddr(p)) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
946 if((r=get_register())) {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
947 caddr(p)=r; regs[r]=PTRC_REG;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
948 } else {
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
949 error(-1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
950 r=creg; /* this can't happen */
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
951 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
952 car(p)=g;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
953 } else {
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
954 r = caddr(p);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
955 }
917947ffeb7c power pc version
kono
parents:
diff changeset
956 rrn = register_name(r);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
957 if (nptr->sc==STATIC) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
958 printf("\taddis %s,r31,ha16(_%s-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
959 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
960 printf("\tla %s,lo16(_%s-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
961 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
962 } else {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
963 printf("\taddis %s,r31,ha16(L_%s$non_lazy_ptr-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
964 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
965 printf("\tlwz %s,lo16(L_%s$non_lazy_ptr-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
966 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
967 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
968 return r;
917947ffeb7c power pc version
kono
parents:
diff changeset
969 }
917947ffeb7c power pc version
kono
parents:
diff changeset
970
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
971 static char *cload(int sz) { return sz==1?"lbz":sz==size_of_short?"lhz":"lwz"; }
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
972 static char *cstore(int sz) { return sz==1?"stb":sz==size_of_short?"sth":"stw"; }
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
973 static char *cext(int sz) { return sz==size_of_short?"extsh":"extsb"; }
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
974
89
917947ffeb7c power pc version
kono
parents:
diff changeset
975 void
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
976 code_label(int labelno)
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
977 {
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
978 clear_ptr_cache();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
979 printf("L_%d:\n",labelno);
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
980 }
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
981
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
982 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
983 code_gvar(int e1,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
984 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
985 r = get_ptr_cache((NMTBL*)cadr(e1));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
986 if(r!=creg)
917947ffeb7c power pc version
kono
parents:
diff changeset
987 printf("\tmr %s,%s\n",register_name(creg),register_name(r));
917947ffeb7c power pc version
kono
parents:
diff changeset
988 return;
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
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
992 code_rgvar(int e1,int creg) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
993 if (!is_int_reg(creg)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
994 printf("\tlwz %s,0(%s)\n",register_name(creg),
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
995 register_name(get_ptr_cache((NMTBL*)cadr(e1))));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
996 }
917947ffeb7c power pc version
kono
parents:
diff changeset
997
917947ffeb7c power pc version
kono
parents:
diff changeset
998 void
165
kono
parents: 164
diff changeset
999 code_crgvar(int e1,int creg,int sign,int sz){
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1000 char *crn = register_name(creg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1001 printf("\t%s %s,0(%s)\n",cload(sz),crn,
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1002 register_name(get_ptr_cache((NMTBL*)cadr(e1))));
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1003 if (sign)
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1004 printf("\t%s %s,%s\n",cext(sz),crn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1005 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1006
165
kono
parents: 164
diff changeset
1007
kono
parents: 164
diff changeset
1008
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1009 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1010 code_register(int e2,int creg) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1011 if (creg!=e2)
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1012 printf("\tmr %s,%s\n",register_name(creg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1013 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1014
917947ffeb7c power pc version
kono
parents:
diff changeset
1015
917947ffeb7c power pc version
kono
parents:
diff changeset
1016 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1017 code_rlvar(int e2,int reg) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1018 lvar_intro(e2);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1019 if (!is_int_reg(reg)) error(-1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1020 printf("\tlwz %s,",register_name(reg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1021 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1022 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1023
917947ffeb7c power pc version
kono
parents:
diff changeset
1024 void
165
kono
parents: 164
diff changeset
1025 code_crlvar(int e2,int reg,int sign,int sz) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1026 lvar_intro(e2);
165
kono
parents: 164
diff changeset
1027 printf("\t%s %s,",cload(sz),register_name(reg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1028 lvar(e2);
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1029 if (sign)
165
kono
parents: 164
diff changeset
1030 printf("\t%s %s,%s\n",cext(sz),register_name(reg),register_name(reg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1031 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1032
165
kono
parents: 164
diff changeset
1033
kono
parents: 164
diff changeset
1034
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1035
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1036
917947ffeb7c power pc version
kono
parents:
diff changeset
1037 void
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1038 code_fname(NMTBL *n,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1039 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1040 r = get_ptr_cache(n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1041 if(r!=creg)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1042 printf("\tmr %s,%s\n",register_name(creg),register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1043 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1044 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1045
917947ffeb7c power pc version
kono
parents:
diff changeset
1046
917947ffeb7c power pc version
kono
parents:
diff changeset
1047 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1048 code_const(int e2,int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1049 char *crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1050 if (-32768<e2&&e2<32768)
917947ffeb7c power pc version
kono
parents:
diff changeset
1051 printf("\tli %s,%d\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1052 else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1053 printf("\tlis %s,ha16(%d)\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1054 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1055 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1056 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1057
917947ffeb7c power pc version
kono
parents:
diff changeset
1058
917947ffeb7c power pc version
kono
parents:
diff changeset
1059 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1060 code_neg(int creg) {
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1061 printf("\tneg %s,%s\n", register_name(creg), register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1062 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1063
917947ffeb7c power pc version
kono
parents:
diff changeset
1064
917947ffeb7c power pc version
kono
parents:
diff changeset
1065 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1066 code_not(int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1067 printf("\tnor %s,%s,%s\n",
917947ffeb7c power pc version
kono
parents:
diff changeset
1068 register_name(creg), register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1069 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1070
917947ffeb7c power pc version
kono
parents:
diff changeset
1071
917947ffeb7c power pc version
kono
parents:
diff changeset
1072 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1073 code_lnot(int creg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1074 printf("\tsubfic r0,%s,0\n", register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1075 printf("\tadde %s,r0,%s\n", register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1076 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1077
917947ffeb7c power pc version
kono
parents:
diff changeset
1078 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1079 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1080 char *xrn,*drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1081 int i,dreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1082 if (car(e2)==REGISTER) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1083 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1084 register_name(cadr(e2)),register_name(cadr(e2)), dir);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1085 if (cadr(reg)!=e2)
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1086 printf("\tmr %s,%s\n",register_name(cadr(reg)),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1087 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1088 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1089 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1090 xrn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1091 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
1092 drn = register_name(dreg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1093 printf("\t%s %s,0(%s)\n",cload(sz),drn,xrn);
172
096559f07a70 some check
kono
parents: 168
diff changeset
1094 if (use && sign && sz!=size_of_int)
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1095 printf("\t%s %s,%s\n",cext(sz),drn,drn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1096 printf("\taddi %s,%s,%d\n",drn,drn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1097 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1098 i=creg;creg=dreg;dreg=i;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
1099 ireg=creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1100 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1101 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1102
917947ffeb7c power pc version
kono
parents:
diff changeset
1103
917947ffeb7c power pc version
kono
parents:
diff changeset
1104 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1105 code_postinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1106 char *xrn,*crn,*nrn;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1107 int dreg,nreg,i;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1108 if (car(e2)==REGISTER) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1109 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1110 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1111 register_name(cadr(e2)),register_name(cadr(e2)),dir);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1112 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1113 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1114 g_expr(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1115 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1116 dreg=get_register(); if (!dreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
1117 xrn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1118 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
1119 nrn = register_name(nreg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1120 printf("\t%s %s,0(%s)\n",cload(sz),xrn,crn);
172
096559f07a70 some check
kono
parents: 168
diff changeset
1121 if (use && sign && sz!=size_of_int)
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1122 printf("\t%s %s,%s\n",cext(sz),xrn,xrn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1123 printf("\taddi %s,%s,%d\n",nrn,xrn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1124 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1125 i=creg;creg=dreg;dreg=i;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1126 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1127 free_register(dreg);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
1128 ireg=creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1129 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1130
917947ffeb7c power pc version
kono
parents:
diff changeset
1131
917947ffeb7c power pc version
kono
parents:
diff changeset
1132 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1133 code_return(int creg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1134 char *crn = register_name(creg);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1135 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,retcont,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1136 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,retcont,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1137 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1138
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1139 #define R1SAVE 1
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1140
917947ffeb7c power pc version
kono
parents:
diff changeset
1141 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1142 code_environment(int creg) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1143 /* save frame pointer */
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1144 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1145 printf("\tlwz %s,0(r1)\n",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1146 #else
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1147 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1148 printf("\tla %s,",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1149 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1150 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1151 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1152
917947ffeb7c power pc version
kono
parents:
diff changeset
1153 void
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1154 code_bool(int e1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1155 char *xrn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1156 int e2,e3;
917947ffeb7c power pc version
kono
parents:
diff changeset
1157 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1158 creg = use_int(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1159 xrn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1160 printf("\tli %s,0\n",xrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1161 jmp(e3=fwdlabel());
917947ffeb7c power pc version
kono
parents:
diff changeset
1162 fwddef(e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1163 printf("\tli %s,1\n",xrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1164 fwddef(e3);
917947ffeb7c power pc version
kono
parents:
diff changeset
1165 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1166
917947ffeb7c power pc version
kono
parents:
diff changeset
1167 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1168 code_gt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1169 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1170 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1171
917947ffeb7c power pc version
kono
parents:
diff changeset
1172 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1173 code_ugt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1174 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1175 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1176
917947ffeb7c power pc version
kono
parents:
diff changeset
1177 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1178 code_ge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1179 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1180 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1181
917947ffeb7c power pc version
kono
parents:
diff changeset
1182 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1183 code_uge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1184 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1185 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1186
917947ffeb7c power pc version
kono
parents:
diff changeset
1187 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1188 code_eq(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1189 return (cond?"eq":"ne");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1190 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1191
917947ffeb7c power pc version
kono
parents:
diff changeset
1192 void
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1193 code_cmp_crgvar(int e1,int sz) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1194 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
1195 char *crn = register_name(creg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1196 r = get_ptr_cache((NMTBL*)cadr(e1));
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1197 printf("\t%s %s,0(%s)\n",cload(sz),crn,register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1198 printf("\tcmpwi cr0,%s,0\n",crn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1199 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1200
917947ffeb7c power pc version
kono
parents:
diff changeset
1201
917947ffeb7c power pc version
kono
parents:
diff changeset
1202 void
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1203 code_cmp_crlvar(int e2,int sz) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1204 char *crn = register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1205 lvar_intro(e2);
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1206 printf("\t%s %s,",cload(sz),crn);
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1207 lvar(e2);
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1208 code_cmp_register(creg);
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1209 }
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1210
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1211
917947ffeb7c power pc version
kono
parents:
diff changeset
1212 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1213 code_cmp_rgvar(int e1) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1214 int r;
917947ffeb7c power pc version
kono
parents:
diff changeset
1215 char *crn = register_name(creg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1216 if (!is_int_reg(creg)) error(-1);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1217 r = get_ptr_cache((NMTBL*)cadr(e1));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1218 printf("\tlwz %s,0(%s)\n",crn,register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1219 code_cmp_register(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1220 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1221
917947ffeb7c power pc version
kono
parents:
diff changeset
1222
917947ffeb7c power pc version
kono
parents:
diff changeset
1223 void
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1224 code_cmp_rlvar(int e2) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1225 char *crn = register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1226 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1227 printf("\tlwz %s,",crn);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1228 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1229 code_cmp_register(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1230 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1231
917947ffeb7c power pc version
kono
parents:
diff changeset
1232
917947ffeb7c power pc version
kono
parents:
diff changeset
1233 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1234 code_cmp_register(int e2) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1235 printf("\tcmpwi cr0,%s,0\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
1236 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1237
917947ffeb7c power pc version
kono
parents:
diff changeset
1238
917947ffeb7c power pc version
kono
parents:
diff changeset
1239 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1240 ascii(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
1241 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1242 printf("\t.ascii \"");
917947ffeb7c power pc version
kono
parents:
diff changeset
1243 while(*s) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1244 if (*s=='\n')
917947ffeb7c power pc version
kono
parents:
diff changeset
1245 printf("%cn",92);
917947ffeb7c power pc version
kono
parents:
diff changeset
1246 else if (*s<' ')
917947ffeb7c power pc version
kono
parents:
diff changeset
1247 printf("%c%03o",92,*s);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1248 else if (*s=='\\')
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1249 printf("\\\\");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1250 else if (*s==34)
917947ffeb7c power pc version
kono
parents:
diff changeset
1251 printf("%c%c",92,34);
917947ffeb7c power pc version
kono
parents:
diff changeset
1252 else
917947ffeb7c power pc version
kono
parents:
diff changeset
1253 printf("%c",*s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1254 s++;
917947ffeb7c power pc version
kono
parents:
diff changeset
1255 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1256 printf("\\0%c\n\t.align 2\n",34);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1257 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1258
917947ffeb7c power pc version
kono
parents:
diff changeset
1259 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1260 code_string(int e1,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1261 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1262 char *s,*crn;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1263 int lb;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1264 crn=register_name(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1265
917947ffeb7c power pc version
kono
parents:
diff changeset
1266 s=(char *)cadr(e1);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1267 printf(".data\t\n.cstring\n\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1268 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1269 printf("L_%d:\n",lb);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1270 ascii(s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1271 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1272 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1273 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1274 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
1275 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1276 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1277 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,lb,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1278 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1279
917947ffeb7c power pc version
kono
parents:
diff changeset
1280 #define MAX_COPY_LEN 20
917947ffeb7c power pc version
kono
parents:
diff changeset
1281
917947ffeb7c power pc version
kono
parents:
diff changeset
1282 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1283 emit_copy(int from,int to,int length,int offset,int value,int det)
917947ffeb7c power pc version
kono
parents:
diff changeset
1284 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1285 char *frn = register_name(from);
917947ffeb7c power pc version
kono
parents:
diff changeset
1286 char *trn = register_name(to);
917947ffeb7c power pc version
kono
parents:
diff changeset
1287 char *drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1288 int fix = 0;
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1289 char *memmove = "memmove";
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1290 int dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1291 drn = register_name(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1292
917947ffeb7c power pc version
kono
parents:
diff changeset
1293 /* length <0 means upward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1294 switch (length) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1295 case 0: break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1296 case 1: case -1:
917947ffeb7c power pc version
kono
parents:
diff changeset
1297 printf("\tlbz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1298 printf("\tstb %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1299 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1300 case 2: case -2:
917947ffeb7c power pc version
kono
parents:
diff changeset
1301 printf("\tlhz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1302 printf("\tsth %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1303 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1304 case 4: case -4:
917947ffeb7c power pc version
kono
parents:
diff changeset
1305 printf("\tlwz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1306 printf("\tstw %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1307 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1308 default:
917947ffeb7c power pc version
kono
parents:
diff changeset
1309 if (-MAX_COPY_LEN<length && length <0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1310 for(;length<=4;length+=4,offset-=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1311 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1312 for(;length<=2;length+=2,offset-=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1313 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1314 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1315 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1316 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1317 } else if (length <=MAX_COPY_LEN) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1318 for(;length>=4;length-=4,offset+=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1319 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1320 for(;length>=2;length-=2,offset+=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1321 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1322 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1323 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1324 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1325 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1326 clear_ptr_cache();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1327 code_save_stacks();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1328 printf("\tli r5,%d\n",length);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1329 printf("\tmr r4,%s\n",frn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1330 printf("\tmr r3,%s\n",trn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1331 /* overrap must be allowed */
e537da31dce3 struct push
kono
parents: 123
diff changeset
1332 printf("\tbl L_%s$stub\n",memmove);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1333 extern_define(memmove,0,FUNCTION,1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1334 fix=0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1335 set_ireg(RET_REGISTER,0);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1336 if (creg!=to) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1337 free_register(to); to = creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1338 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1339 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1340 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1341 if (value) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1342 /* creg must point top of the destination data */
917947ffeb7c power pc version
kono
parents:
diff changeset
1343 /* this code is necessary for the value of assignment or function call */
917947ffeb7c power pc version
kono
parents:
diff changeset
1344 /* otherwise we don't need this */
917947ffeb7c power pc version
kono
parents:
diff changeset
1345 if (fix) printf("\taddi %s,%s,%d\n",trn,trn,fix);
917947ffeb7c power pc version
kono
parents:
diff changeset
1346 if(creg!=to) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1347 free_register(creg); creg=to;
917947ffeb7c power pc version
kono
parents:
diff changeset
1348 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1349 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1350 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1351 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1352
917947ffeb7c power pc version
kono
parents:
diff changeset
1353 int
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1354 struct_push(int e4,int t,int arg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1355 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1356 int length,count;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1357 int dreg,sreg; char *drn,*crn,*srn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1358 g_expr(e4);
917947ffeb7c power pc version
kono
parents:
diff changeset
1359 length=size(t);
917947ffeb7c power pc version
kono
parents:
diff changeset
1360 if(length%size_of_int) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1361 length += size_of_int - (length%size_of_int);
917947ffeb7c power pc version
kono
parents:
diff changeset
1362 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1363 dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1364 drn = register_name(dreg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1365 crn = register_name(creg);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1366 if (length<MAX_COPY_LEN) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1367 sreg = get_register(); if (!sreg) error(-1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1368 srn = register_name(sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1369 code_lvar(cadr(arg),sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1370 for(count=0;length<MAX_COPY_LEN;count++,length-=size_of_int) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1371 if (length==0) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1372 free_register(sreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1373 free_register(dreg);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1374 return count;
e537da31dce3 struct push
kono
parents: 123
diff changeset
1375 } else {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1376 printf("\tlwz %s,%d(%s)\n",drn,length-size_of_int,crn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1377 printf("\tstwu %s,%d(%s)\n",drn,-size_of_int,srn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1378 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1379 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1380 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1381 code_lvar(cadr(arg),dreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1382 /* downward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1383 emit_copy(creg,dreg,length,0,0,1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1384 if (dreg) free_register(dreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1385 return length/size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
1386 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1387
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1388 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1389 set_ireg(int reg,int mode)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1390 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1391 if (!is_int_reg(reg)) error(-1);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1392 if (reg!=creg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1393 clear_ptr_cache_reg(reg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1394 if (ireg && reg!=ireg ) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1395 free_register(ireg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1396 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1397 printf("\tmr %s,%s\n",register_name(reg),register_name(ireg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1398 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1399 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1400 free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1401 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1402 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1403 creg = ireg = reg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1404 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1405
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1406 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1407 set_freg(int reg,int mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1408 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1409 if (!is_float_reg(reg)) error(-1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1410 if (reg!=creg) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1411 if (reg!=freg) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1412 free_register(freg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1413 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1414 printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1415 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1416 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1417 if (creg!=ireg) free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1418 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1419 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1420 creg = freg = reg;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1421 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1422
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1423 void
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1424 set_lreg(int reg,int mode)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1425 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1426 if (!is_longlong_reg(reg)) error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1427 if (reg!=creg) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1428 if (reg!=lreg) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1429 free_register(lreg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1430 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1431 printf("\tmr %s,%s\n",
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1432 lregister_name_low(reg),lregister_name_low(lreg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1433 printf("\tmr %s,%s\n",
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1434 lregister_name_high(reg),lregister_name_high(lreg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1435 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1436 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1437 regs[reg]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1438 regs[regv_l(reg)]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1439 regs[regv_h(reg)]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1440 if (creg!=ireg) free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1441 free_register(creg);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1442 }
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1443 creg = freg = reg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1444 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1445
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1446 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1447 use_reg(int arg)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1448 {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1449 printf("# use reg %d\n",arg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1450 if (arg<0||arg> REAL_MAX_REGISTER+REAL_MAX_FREGISTER+ REAL_MAX_LREGISTER)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1451 error(-1);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1452 regs[arg]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1453 if (is_longlong_reg(arg)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1454 regs[regv_l(arg)]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1455 regs[regv_h(arg)]=USING_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1456 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1457 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1458
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1459 void
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1460 code_save_input_registers()
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1461 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1462 int args;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1463 NMTBL *n;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1464 int reg;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1465 int tag;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1466 int lvar;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1467 int t;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1468 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1469 int reg_offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1470 int offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1471
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1472 for(args = fnptr->dsp;args;args = cadr(args)) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1473 n = (NMTBL *)caddr(args);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1474 tag = n->sc;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1475 reg = n->dsp;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1476 if (!n||n==&null_nptr) error(REG_ERR);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1477 if (tag==REGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1478 /* regs[reg]==INPUT_REG case should be considered */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1479 n->dsp = offset;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1480 offset+=size_of_int;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1481 t = INT;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1482 reg += reg_offset; /* for duplicated floating point argument */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1483 } else if (tag==DREGISTER) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1484 /* regs[reg]==INPUT_REG case should be considered */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1485 n->dsp = offset;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1486 t = n->ty;
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1487 if(t==FLOAT) { offset+=size_of_float; reg_offset+=1; }
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1488 else if(t==DOUBLE) { offset+=size_of_double; reg_offset+=2; }
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1489 else error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1490 } else if (tag==LREGISTER) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1491 /* regs[reg]==INPUT_REG case should be considered */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1492 n->dsp = offset;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1493 t = n->ty;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1494 offset+=size_of_longlong; reg_offset+=2;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1495 } else {
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1496 offset += size(n->ty);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1497 continue;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1498 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1499 n->sc = LVAR;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1500 lvar = list2(LVAR,n->dsp);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1501 g_expr_u(assign_expr0(list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1502 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1503 free_register(reg);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1504 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1505 }
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1506 my_func_args = offset;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1507 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1508
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1509 int
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1510 simple_args(int e3)
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1511 {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1512 return
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1513 !contains_in_list(e3,FUNCTION) &&
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1514 !contains_in_list(e3,CONV) &&
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1515 !contains_in_list(e3,RSTRUCT) &&
164
1c2a9232ea93 mc.h generation
kono
parents: 162
diff changeset
1516 !contains_in_list(e3,STASS)
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1517 ;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1518 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1519
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1520 int
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1521 caller_arg_offset_v(int arg)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1522 {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1523 return ARG_LVAR_OFFSET+arg*size_of_int;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1524 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1525
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1526 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1527 function(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
1528 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1529 int e2,e3,e4,e5,nargs,t,r0,r1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1530 int arg,reg_arg,freg_arg,arg_assign;
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1531 int dots;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1532 int reg_arg_list=0,ret_type,special_lvar;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
1533 NMTBL *fn = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1534 int jmp = 0;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1535 char *jrn;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1536
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1537 special_lvar = -1;
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1538 ret_type = cadr(cadddr(e1));
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1539 if (ret_type==CHAR) ret_type=INT;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1540
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1541 /* check argments type is DOTS? */
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1542 t = caddr(cadddr(e1));
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1543 if (t==0 || t==DOTS) dots = 1;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1544 else {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1545 dots = 0;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1546 for(t = caddr(cadddr(e1));t;t = cadr(t)) {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1547 if (car(t)==DOTS) dots = 1;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1548 }
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1549 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1550
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1551 e2 = cadr(e1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1552 if (car(e2) == FNAME) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1553 fn=(NMTBL *)cadr(e2);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1554 } else {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1555 jmp = get_register_var(0);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1556 if (car(jmp)!=REGISTER) error(-1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1557 reg_arg_list = list2(jmp,reg_arg_list);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1558 g_expr(e2);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1559 code_register(creg,cadr(jmp));
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1560 /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1561 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1562
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1563 /* now all input register vars are free */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1564 code_save_stacks();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1565 set_lreg(LREG_LREGISTER,0);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1566 set_ireg(CREG_REGISTER,0);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1567 set_freg(FREG_FREGISTER,0);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1568
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1569 nargs = reg_arg = freg_arg = arg_assign = 0;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1570 for (e3 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1571 t=caddr(e3);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1572 e4 = car(e3);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1573 if(scalar(t)) {
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1574 if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1575 arg = list2(LVAR,caller_arg_offset_v(nargs));
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1576 } else if (!simple_args(e3) && cadr(e3)) {
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1577 arg = get_register_var(0);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1578 arg_assign = list2(
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1579 assign_expr0(get_input_register_var(reg_arg,0,0),
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1580 arg,t,t),
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1581 arg_assign);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1582 } else {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1583 arg = get_input_register_var(reg_arg,0,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1584 }
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1585 if (car(arg)==REGISTER) use_reg(cadr(arg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1586 /* protect from input register free */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1587 reg_arg_list = list2(arg,reg_arg_list);
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1588 g_expr_u(assign_expr0(arg,e4,t,t));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1589 nargs ++ ; reg_arg++;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1590 continue;
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
1591 } else if (t==LONGLONG||t==ULONGLONG) {
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1592 if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1593 arg = list2(LVAR,caller_arg_offset_v(nargs));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1594 } else if (!simple_args(e3) && cadr(e3)) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1595 arg = get_register_var(0);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1596 arg_assign = list2(
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1597 assign_expr0(get_input_lregister_var(reg_arg,0,0),
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1598 arg,t,t),
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1599 arg_assign);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1600 } else {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1601 arg = get_input_lregister_var(reg_arg,0,0);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1602 }
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1603 if (car(arg)==LREGISTER) use_reg(cadr(arg));
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1604 reg_arg_list = list2(arg,reg_arg_list);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1605 g_expr_u(assign_expr0(arg,e4,t,t));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1606 nargs ++ ; reg_arg++;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1607 nargs ++ ; reg_arg++;
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
1608 continue;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1609 } else if (t==DOUBLE||t==FLOAT) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1610 if (reg_arg<MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1611 /* sigh...
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1612 printf requies floating value in integer registers
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1613 */
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1614 if (dots) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1615 if (car(e4)==DRLVAR) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1616 special_lvar = cadr(e4);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1617 e5 = list2(LVAR,special_lvar);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1618 } else {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1619 special_lvar = new_lvar(size_of_double);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1620 g_expr(assign_expr0(
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1621 (e5=list2(LVAR,special_lvar)),e4,DOUBLE,t));
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1622 reg_arg_list = list2(e5,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1623 e4 = list2(DREGISTER,freg);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1624 /* freg should not change until XXX */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1625 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1626 r0=get_input_register_var(reg_arg,0,0);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1627 r1 = reg_arg+1+MIN_TMP_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1628 if (regs[r1]==PTRC_REG)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1629 clear_ptr_cache_reg(list2(REGISTER,r1));
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1630 /* else if (regs[r1]) error(-1); */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1631 r1=get_input_register_var_1(reg_arg+1,0,0);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1632 use_reg(cadr(r0)); /* protect from input register free */
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1633 use_reg(cadr(r1)); /* protect from input register free */
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1634 reg_arg_list = list2(r0,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1635 reg_arg_list = list2(r1,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1636 arg_assign = list2( assign_expr0(r0,e5,INT,INT), arg_assign);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1637 arg_assign = list2( assign_expr0(r1,
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1638 list2(LVAR,special_lvar+size_of_int),
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1639 INT,INT), arg_assign);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1640 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1641 reg_arg += 2;
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1642 }
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1643 if (dots && freg_arg>=4 && freg_arg<MAX_INPUT_DREGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1644 /* oh my god!
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1645 it requies integer register and floating register and
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1646 stack value. You are crazy.
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1647 */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1648 arg_assign = list2(
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1649 assign_expr0(list2(LVAR,caller_arg_offset_v(nargs)),
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1650 get_input_dregister_var(freg_arg,0,0,1),t,t),
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1651 arg_assign);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1652 }
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1653 if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1654 arg = list2(LVAR,caller_arg_offset_v(nargs));
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1655 } else if (!simple_args(e3) && cadr(e3)) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1656 arg = get_dregister_var(0,1);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1657 arg_assign = list2(
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1658 assign_expr0(get_input_dregister_var(freg_arg,0,0,1),
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1659 arg,t,t),
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1660 arg_assign);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1661 } else {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1662 arg = get_input_dregister_var(freg_arg,0,0,1);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1663 }
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1664 if (car(arg)==DREGISTER)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1665 use_reg(cadr(arg)); /* protect from input register free */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1666 reg_arg_list = list2(arg,reg_arg_list);
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1667 g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1668 freg_arg++;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1669 nargs += size(t)/size_of_int;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1670 continue;
203
28baf6cd9ad1 *** empty log message ***
kono
parents: 202
diff changeset
1671 } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1672 arg = list2(LVAR,caller_arg_offset_v(nargs));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1673 nargs += struct_push(e4,t,arg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1674 continue;
917947ffeb7c power pc version
kono
parents:
diff changeset
1675 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1676 error(TYERR);
917947ffeb7c power pc version
kono
parents:
diff changeset
1677 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1678 ++nargs;
917947ffeb7c power pc version
kono
parents:
diff changeset
1679 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1680 if (max_func_args<nargs) max_func_args=nargs;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1681 for(;arg_assign;arg_assign=cadr(arg_assign)) {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1682 g_expr_u(car(arg_assign));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1683 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1684 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1685 if (car(e2) == FNAME) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1686 printf("\tbl\tL_%s$stub\n",fn->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1687 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1688 jrn = register_name(cadr(jmp));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1689 printf("\tmtctr %s\n",jrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1690 printf("\tbctrl\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1691 }
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1692 for(;reg_arg_list;reg_arg_list=cadr(reg_arg_list)) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1693 arg = car(reg_arg_list);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1694 if (car(arg)==REGISTER||car(arg)==DREGISTER||car(arg)==FREGISTER
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1695 ||car(arg)==LREGISTER)
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1696 free_register(cadr(arg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1697 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1698 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1699 if (ret_type==DOUBLE||ret_type==FLOAT) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1700 set_freg(RET_FREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1701 } else if (ret_type==ULONGLONG||ret_type==LONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1702 set_lreg(RET_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1703 use_reg(RET_LREGISTER);
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1704 } else if (ret_type==VOID) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1705 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1706 set_ireg(RET_REGISTER,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1707 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1708 return ret_type;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1709 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1710
917947ffeb7c power pc version
kono
parents:
diff changeset
1711 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1712 code_frame_pointer(int e3) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1713 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1714 printf("\tmr r1,%s\n",register_name(e3));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1715 #else
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1716 printf("\tmr r30,%s\n",register_name(e3));
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1717 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1718 }
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 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1722 code_fix_frame_pointer(int disp_offset) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1723 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1724 printf("\tla r30,");
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1725 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1726 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1727
917947ffeb7c power pc version
kono
parents:
diff changeset
1728 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1729 code_jmp(char *s) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1730 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1731 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1732 printf("\tb L_%s$stub\n",s);
917947ffeb7c power pc version
kono
parents:
diff changeset
1733 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1734
917947ffeb7c power pc version
kono
parents:
diff changeset
1735
917947ffeb7c power pc version
kono
parents:
diff changeset
1736 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1737 code_indirect_jmp(int e2) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1738 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1739 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1740 printf("\tmtctr %s\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
1741 printf("\tbctr\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1742 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1743
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1744 int
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1745 code_rindirect(int e1, int offset, int us)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1746 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1747 char *crn;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1748 g_expr(e1);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1749 crn=register_name(creg);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1750 printf("\tlwz %s,%d(%s)\n",crn,offset,crn);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1751 return us?UNSIGNED:INT;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1752 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1753
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1754 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1755 code_crindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1756 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1757 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1758 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1759 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1760 if (us) {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1761 printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1762 return UCHAR;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1763 } else {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1764 printf("\tlbz %s,%d(%s)\n",crn,offset,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1765 printf("\textsb %s,%s\n",crn,crn);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1766 return CHAR;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1767 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1768 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1769
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1770 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1771 code_srindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1772 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1773 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1774 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1775 crn=register_name(creg);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1776 if (us) {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1777 printf("\tlhz %s,%d(%s)\n",crn,offset,crn);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1778 return USHORT;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1779 } else {
165
kono
parents: 164
diff changeset
1780 printf("\tlhz %s,%d(%s)\n",crn,offset,crn);
kono
parents: 164
diff changeset
1781 printf("\textsh %s,%s\n",crn,crn);
kono
parents: 164
diff changeset
1782 return SHORT;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1783 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1784 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1785
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1786 #if FLOAT_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1787 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1788 code_drindirect(int e1, int offset, int d)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1789 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1790 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1791 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1792 crn=register_name(creg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
1793 creg = d?use_double(creg):use_float(creg);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1794 printf("\t%s %s,%d(%s)\n",fload(d),
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1795 fregister_name(freg),offset,crn);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1796 return d?DOUBLE:FLOAT;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1797 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1798 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1799
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1800 #if LONGLONG_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1801 int
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1802 code_lrindirect(int e1, int offset, int us)
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1803 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1804 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1805 g_expr(e1);
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1806 crn=register_name(creg);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1807 if (!lreg) lreg = get_lregister();
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1808 printf("\tlwz %s,%d(%s)\n",crn,offset,lregister_name_low(lreg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1809 printf("\tlwz %s,%d(%s)\n",crn,offset+size_of_int,lregister_name_high(lreg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1810 creg = lreg;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1811 return us?ULONGLONG:LONGLONG;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1812 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1813 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1814
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
1815
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1816 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1817 code_assign_gvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1818 int r;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1819 char *crn,*rrn;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1820 r = get_ptr_cache((NMTBL*)cadr(e2));
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1821 rrn=register_name(r);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1822 crn=register_name(creg);
165
kono
parents: 164
diff changeset
1823 if (byte==1) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1824 printf("\tstb %s,0(%s)\n",crn,rrn);
165
kono
parents: 164
diff changeset
1825 } else if (byte==size_of_short) {
kono
parents: 164
diff changeset
1826 printf("\tsth %s,0(%s)\n",crn,rrn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1827 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1828 printf("\tstw %s,0(%s)\n",crn,rrn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1829 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1830 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1831
917947ffeb7c power pc version
kono
parents:
diff changeset
1832 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1833 code_assign_lvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1834 char *crn;
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1835 crn=register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1836 lvar_intro(e2);
165
kono
parents: 164
diff changeset
1837 if (byte==1) {
kono
parents: 164
diff changeset
1838 printf("\tstb %s,",crn);
kono
parents: 164
diff changeset
1839 } else if (byte==size_of_short) {
kono
parents: 164
diff changeset
1840 printf("\tsth %s,",crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1841 } else {
165
kono
parents: 164
diff changeset
1842 printf("\tstw %s,",crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1843 }
165
kono
parents: 164
diff changeset
1844 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1845 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1846
917947ffeb7c power pc version
kono
parents:
diff changeset
1847 void
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1848 code_assign_register(int e2,int byte,int creg) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1849 if (e2!=creg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1850 printf("\tmr %s,%s\n",register_name(e2),register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1851 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1852
917947ffeb7c power pc version
kono
parents:
diff changeset
1853 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
1854 code_assign(int e2,int byte,int creg) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1855 char *drn=register_name(e2);
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1856 char *crn=register_name(creg);
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1857
165
kono
parents: 164
diff changeset
1858 if (byte==1) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1859 printf("\tstb %s,0(%s)\n",crn,drn);
165
kono
parents: 164
diff changeset
1860 } else if (byte==size_of_short) {
kono
parents: 164
diff changeset
1861 printf("\tsth %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1862 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1863 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1864 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1865 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1866
917947ffeb7c power pc version
kono
parents:
diff changeset
1867
917947ffeb7c power pc version
kono
parents:
diff changeset
1868 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1869 code_register_assop(int e2,int op,int byte) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1870 int reg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1871 int xreg = creg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1872 creg = reg = e2;
917947ffeb7c power pc version
kono
parents:
diff changeset
1873 tosop(op,xreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1874 creg = xreg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1875 if (creg!=reg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1876 printf("\tmr %s,%s\n",register_name(creg),register_name(reg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1877 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1878
917947ffeb7c power pc version
kono
parents:
diff changeset
1879
917947ffeb7c power pc version
kono
parents:
diff changeset
1880 void
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1881 code_assop(int op,int byte,int sign) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1882 char *xrn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1883 int xreg;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1884 int edx = get_register(); if(!edx) error(-1);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1885 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1886 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
1887 ld_indexx(byte,0,edx,sign);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1888 tosop(op,xreg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1889 crn = register_name(creg);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1890 drn = register_name(edx);
165
kono
parents: 164
diff changeset
1891 if (byte==1) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1892 printf("\tstb %s,0(%s)\n",crn,drn);
165
kono
parents: 164
diff changeset
1893 } else if (byte==size_of_short) {
kono
parents: 164
diff changeset
1894 printf("\tsth %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1895 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1896 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1897 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1898 free_register(edx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1899 emit_pop_free(xreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1900 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1901
917947ffeb7c power pc version
kono
parents:
diff changeset
1902
917947ffeb7c power pc version
kono
parents:
diff changeset
1903 void
917947ffeb7c power pc version
kono
parents:
diff changeset
1904 tosop(int op,int oreg)
917947ffeb7c power pc version
kono
parents:
diff changeset
1905 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1906 int dx;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1907 char *orn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1908
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1909 if(oreg==-1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1910 error(-1);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1911 } else if (oreg<= -REG_LVAR_OFFSET) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1912 dx = get_register(); if (dx<0) error(-1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1913 code_rlvar(oreg+REG_LVAR_OFFSET,dx);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1914 oreg = dx;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1915 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
1916
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1917 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1918 case LSHIFT:
917947ffeb7c power pc version
kono
parents:
diff changeset
1919 case ULSHIFT:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1920 shift("slw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1921 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1922 case RSHIFT:
186
6391432ca002 nkf binary fix
kono
parents: 185
diff changeset
1923 shift("sraw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1924 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1925 case URSHIFT:
186
6391432ca002 nkf binary fix
kono
parents: 185
diff changeset
1926 shift("srw",oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1927 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1928 }
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1929 orn = register_name(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1930 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1931 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1932 case ADD:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1933 printf("\tadd %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1934 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1935 case SUB:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1936 printf("\tsub %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1937 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1938 case CMP:
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1939 printf("\tcmpw cr0,%s,%s\n",crn,orn);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1940 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1941 case BAND:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1942 printf("\tand %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1943 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1944 case EOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1945 printf("\txor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1946 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1947 case BOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1948 printf("\tor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1949 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1950 case MUL:
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1951 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1952 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1953 case UMUL:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1954 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1955 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1956 case DIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1957 printf("\tdivw %s,%s,%s\n",crn,crn,orn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1958 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1959 case UDIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1960 printf("\tdivwu %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1961 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1962 case MOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1963 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1964 drn = register_name(dx);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1965 printf("\tdivw %s,%s,%s\n",drn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1966 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1967 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1968 free_register(dx);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1969 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1970 case UMOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
1971 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1972 drn = register_name(dx);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1973 printf("\tdivwu %s,%s,%s\n",drn,crn,orn);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1974 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
1975 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
1976 free_register(dx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1977 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1978 default:
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1979 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1980 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1981 if(oreg!=creg) free_register(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1982 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1983
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1984 int
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1985 code_const_op_p(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1986 {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1987 if (op==BAND||op==DIV||op==UDIV||op==MOD||op==UMOD) return 0;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1988 return (-127<v&&v<128);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1989 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1990
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1991 void
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1992 oprtc(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1993 {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1994 char *crn = register_name(creg);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1995
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1996 switch(op) {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1997 case LSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1998 case ULSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
1999 printf("\tslwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2000 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2001 case RSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2002 printf("\tsrawi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2003 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2004 case URSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2005 printf("\tsrwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2006 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2007 case ADD:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2008 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2009 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2010 case SUB:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2011 printf("\tsubi %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2012 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2013 case CMP:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2014 printf("\tcmpwi cr0,%s,lo16(%d)\n",crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2015 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2016 case EOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2017 printf("\txori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2018 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2019 case BOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2020 printf("\tori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2021 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2022 case MUL:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2023 printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2024 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2025 case UMUL:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2026 printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2027 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2028 default:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2029 error(-1);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2030 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2031 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2032
917947ffeb7c power pc version
kono
parents:
diff changeset
2033 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2034 shift(char *op, int reg)
917947ffeb7c power pc version
kono
parents:
diff changeset
2035 {
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2036 char *crn = register_name(creg);
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2037 char *rrn = register_name(reg);
186
6391432ca002 nkf binary fix
kono
parents: 185
diff changeset
2038 printf("\t%s %s,%s,%s\n",op,crn,crn,rrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2039 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2040
917947ffeb7c power pc version
kono
parents:
diff changeset
2041 void
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
2042 ld_indexx(int byte, int n, int xreg,int sign)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2043 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2044 char *crn = register_name(creg);
165
kono
parents: 164
diff changeset
2045 if (byte==1) {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2046 printf("\tlbz %s,%d(%s)\n",register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2047 register_name(xreg));
162
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
2048 if (sign)
0c604d2ff585 *** empty log message ***
kono
parents: 160
diff changeset
2049 printf("\textsb %s,%s\n",crn,crn);
165
kono
parents: 164
diff changeset
2050 } else if (byte==size_of_short) {
kono
parents: 164
diff changeset
2051 printf("\tlhz %s,%d(%s)\n",register_name(creg),n,
kono
parents: 164
diff changeset
2052 register_name(xreg));
kono
parents: 164
diff changeset
2053 if (sign)
kono
parents: 164
diff changeset
2054 printf("\textsh %s,%s\n",crn,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2055 } else
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2056 printf("\tlwz %s,%d(%s)\n",register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2057 register_name(xreg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2058 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2059
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2060 int
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2061 code_csvalue()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2062 {
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2063 return creg;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2064 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2065
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2066 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2067 code_cmpdimm(int e, int csreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2068 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2069 /* used in dosiwtch() */
917947ffeb7c power pc version
kono
parents:
diff changeset
2070 if(chk) return;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2071 printf("\tcmpwi cr0,%s,%d\n",register_name(csreg),e);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2072 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2073
917947ffeb7c power pc version
kono
parents:
diff changeset
2074 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2075 code_opening(char *filename)
917947ffeb7c power pc version
kono
parents:
diff changeset
2076 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2077 printf("\t.file \"%s\"\n",filename);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2078 /* printf("\t.version\t\"01.01\"\n"); */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2079 /* printf("gcc2_compiled.:\n"); */
917947ffeb7c power pc version
kono
parents:
diff changeset
2080 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2081 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2082
917947ffeb7c power pc version
kono
parents:
diff changeset
2083 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2084 rexpr(int e1, int l1, char *s,int t)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2085 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2086 g_expr(list3(CMP,cadr(e1),caddr(e1)));
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2087 printf("\tb%s cr0,L_%d\n",s,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2088 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2089
917947ffeb7c power pc version
kono
parents:
diff changeset
2090
917947ffeb7c power pc version
kono
parents:
diff changeset
2091 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2092 jcond(int l, char cond)
917947ffeb7c power pc version
kono
parents:
diff changeset
2093 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2094 if (chk) return;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2095 printf("\tb%s cr0,L_%d\n",cond?"ne":"eq",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2096 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2097
917947ffeb7c power pc version
kono
parents:
diff changeset
2098 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2099 jmp(int l)
917947ffeb7c power pc version
kono
parents:
diff changeset
2100 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2101 control=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2102 if (chk) return;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2103 printf("\tb\tL_%d\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2104 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2105
917947ffeb7c power pc version
kono
parents:
diff changeset
2106 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2107 gen_comment(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
2108 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2109 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2110 printf("## %s",s);
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 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2114 code_enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2115 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2116 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
2117 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2118 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2119 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2120 if (stmode!=STATIC)
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2121 printf(".globl _%s\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2122 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2123 printf("\t.type\t%s,@function\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2124 #endif
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2125 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
2126 code_disp_label=fwdlabel();
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2127 printf("\tla r1,lo16(L_%d)(r30)\n",code_disp_label);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2128 printf("\tbcl 20,31,L_%d\n",code_base = fwdlabel());
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2129 fwddef(code_base);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2130 printf("\tmflr r31\n");
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2131 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2132 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2133
917947ffeb7c power pc version
kono
parents:
diff changeset
2134
917947ffeb7c power pc version
kono
parents:
diff changeset
2135 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2136 code_enter1(int args)
917947ffeb7c power pc version
kono
parents:
diff changeset
2137 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2138 set_lreg(LREG_LREGISTER,0);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2139 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2140 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2141 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2142
917947ffeb7c power pc version
kono
parents:
diff changeset
2143 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2144 code_leave(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2145 {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2146 int r1_offsetv;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2147 disp&= -size_of_int;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2148 r1_offsetv = -disp+max_func_args*size_of_int+code_disp_offset;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2149
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2150 printf(".set L_%d,%d\n",code_disp_label,-r1_offsetv);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2151 local_table();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2152 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2153 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2154
917947ffeb7c power pc version
kono
parents:
diff changeset
2155 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2156 enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2157 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2158 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
2159 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2160 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2161 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2162 if (stmode!=STATIC)
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2163 printf(".globl _%s\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2164 /*
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2165 printf("\t.type\t%s,@function\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2166 */
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2167 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
2168 code_setup=fwdlabel();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2169 printf("\tmflr r0\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2170 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
2171 code_base=fwdlabel();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2172 fwddef(code_base);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2173 r1_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2174 lvar_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2175 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
2176 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
2177 printf("\tmflr r31\n");
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2178 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2179 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2180
917947ffeb7c power pc version
kono
parents:
diff changeset
2181 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2182 enter1()
917947ffeb7c power pc version
kono
parents:
diff changeset
2183 {
182
e1e9ec8c96a7 some fix
kono
parents: 178
diff changeset
2184 text_mode();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2185 // set_lreg(LREG_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2186 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2187 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
2188 }
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2189
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2190 int
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2191 reg_save_offset()
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2192 {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2193 return -(
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2194 (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*size_of_int+
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2195 (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*size_of_double
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2196 );
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2197 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2198
917947ffeb7c power pc version
kono
parents:
diff changeset
2199 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2200 leave(int control, char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2201 {
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
2202 int retcont1=0,sz;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2203
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2204 if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2205 reg_save = reg_save_offset();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2206
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2207 if (control) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2208 code_set_return_register(1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2209 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2210 if (retcont) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2211 if (control) jmp(retlabel);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2212 retcont1 = fwdlabel();
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2213 fwddef(retcont);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2214 if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2215 printf("\tfmr f1,f31\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2216 } else if (cadr(fnptr->ty)>0&&(
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2217 car(cadr(fnptr->ty))==STRUCT ||
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2218 car(cadr(fnptr->ty))==UNION)) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2219 sz = size(cadr(fnptr->ty));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2220 printf("\tli r7,%d\n",sz);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2221 printf("\tsubl r6,r7,r30\n");
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2222 printf("\tlwz r3,lo16(%d)(r30)\n",(my_func_args-1)*size_of_int);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2223 emit_copy(6,3,sz,0,1,1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2224 } else if (cadr(fnptr->ty)!=VOID) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2225 printf("\tmr r3,r29\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2226 }
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2227 #if !R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2228 printf("\tla r1,lo16(%d)(r30)\n",
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2229 -reg_save+my_func_args*size_of_int);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2230 #endif
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2231 printf("\tb L_%d\n",retcont1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2232 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2233 fwddef(retlabel);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2234 printf("\tlwz r1,0(r1)\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2235 if (retcont) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2236 fwddef(retcont1);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2237 }
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2238 if (max_freg_var>=0) {
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2239 printf("\tlmw r%d,%d(r1)\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2240 REG_VAR_BASE-max_reg_var,reg_save);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2241 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
2242 printf("\tb restFP+%d ; restore f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2243 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2244 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
2245 } else {
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2246 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
2247 printf("\tmtlr r0\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2248 printf("\tlmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2249 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
2250 printf("\tblr\n");
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2251 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2252
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2253 disp &= -size_of_int;
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2254 fwddef(code_setup);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2255 printf("\tstmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2256 REG_VAR_BASE-max_reg_var,reg_save);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2257 printf("\tstw r0,8(r1)\n");
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2258 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
2259 printf("\tb saveFP+%d ; save f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2260 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2261 FREG_VAR_BASE-max_freg_var);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2262 else {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2263 printf("\tblr\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2264 }
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2265
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2266 code_offset_set();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2267 local_table();
917947ffeb7c power pc version
kono
parents:
diff changeset
2268 labelno++;
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2269 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2270 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2271
917947ffeb7c power pc version
kono
parents:
diff changeset
2272
917947ffeb7c power pc version
kono
parents:
diff changeset
2273 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2274 code_set_return_register(int mode) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2275 if (cadr(fnptr->ty)==DOUBLE||cadr(fnptr->ty)==FLOAT) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2276 set_freg(RET_FREGISTER,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2277 } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2278 set_lreg(RET_LREGISTER,mode);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2279 } else if (cadr(fnptr->ty)==VOID) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2280 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2281 set_ireg(RET_REGISTER,mode);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2282 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2283 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2284
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2285 int
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2286 code_get_fixed_creg(int reg,int type) {
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2287 return creg;
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2288 }
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2289
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2290 void
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2291 code_set_fixed_creg(int reg,int mode,int type) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2292 if (type==FLOAT||type==DOUBLE) {
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2293 set_freg(reg,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2294 } else if (type==LONGLONG||type==ULONGLONG) {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2295 set_lreg(reg,mode);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2296 use_reg(reg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2297 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2298 set_ireg(reg,mode);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2299 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2300 }
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2301
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2302 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2303 gen_gdecl(char *n, int gpc)
917947ffeb7c power pc version
kono
parents:
diff changeset
2304 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2305 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2306 if (stmode!=STATIC)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2307 printf(".globl _%s\n",n);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2308 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2309 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2310
917947ffeb7c power pc version
kono
parents:
diff changeset
2311 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2312 align(int t)
917947ffeb7c power pc version
kono
parents:
diff changeset
2313 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2314 if (t!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2315 if (data_alignment & 1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2316 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2317 data_alignment = 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2318 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2319 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2320
917947ffeb7c power pc version
kono
parents:
diff changeset
2321 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2322 emit_data(int e, int t, NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
2323 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2324 int l;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2325 #if FLOAT_CODE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2326 double d;
917947ffeb7c power pc version
kono
parents:
diff changeset
2327 float f;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2328 #endif
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2329 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2330 long long ll;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2331 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2332 char *name;
917947ffeb7c power pc version
kono
parents:
diff changeset
2333 name = n->nm;
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
2334 if(mode!=GDECL && mode!=STADECL) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2335 error(-1); return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2336 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2337 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2338 if (n->dsp != -1) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2339 n->dsp = -1; /* initiallized flag */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2340 printf(".globl\t_%s\n",name);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2341 data_mode(name);
917947ffeb7c power pc version
kono
parents:
diff changeset
2342 align(t);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2343 printf("_%s:\n",name);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2344 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
2345 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
2346 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2347 if(car(e)==CONST) {
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2348 if (t==CHAR||t==UCHAR) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2349 printf("\t.byte %d\n",cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
2350 if (data_alignment>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
2351 data_alignment++;
917947ffeb7c power pc version
kono
parents:
diff changeset
2352 gpc += 1;
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2353 } else if (t==SHORT||t==USHORT) {
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2354 printf("\t.short %d\n",cadr(e));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2355 if (data_alignment>0) data_alignment++;
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2356 gpc += size_of_short;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2357 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
2358 printf("\t.long %d\n",cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
2359 gpc += size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
2360 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2361 #if LONGLONG_CODE
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2362 } else if(t==LONGLONG||t==ULONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2363 ll = lcadr(e);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2364 printf("\t.long\t0x%x,0x%x\n",code_l2(ll),code_l1(ll));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2365 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2366 #if FLOAT_CODE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2367 } else if(t==DOUBLE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2368 d = dcadr(e);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2369 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2370 } else if(t==FLOAT) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2371 f = dcadr(e);
917947ffeb7c power pc version
kono
parents:
diff changeset
2372 printf("\t.long\t0x%x\n",*(int *)&f);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2373 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2374 } else if(t!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2375 gpc += size_of_int;
917947ffeb7c power pc version
kono
parents:
diff changeset
2376 if(car(e)==ADDRESS&&car(cadr(e))==GVAR) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2377 printf("\t.long _%s\n",((NMTBL *)cadr(cadr(e)))->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2378 } else if(car(e)==FNAME) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2379 printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2380 } else if(car(e)==GVAR) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2381 printf("\t.long _%s\n",((NMTBL *)cadr(e))->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2382 } else if(car(e)==STRING) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2383 if (car(n->ty)!=ARRAY || cadr(n->ty)!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2384 l = fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2385 printf("\t.long L_%d\n",l);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2386 printf(".cstring\n\t.align 2\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2387 printf("L_%d:\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2388 output_mode = RODATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
2389 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2390 ascii((char *)cadr(e));
917947ffeb7c power pc version
kono
parents:
diff changeset
2391 } else error(TYERR);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
2392 } else error(TYERR);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2393 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2394
917947ffeb7c power pc version
kono
parents:
diff changeset
2395 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2396 emit_data_closing(NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
2397 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2398 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2399 int lb;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2400 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2401 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2402 if (mode==GDECL) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2403 data_mode(0);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2404 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2405 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2406 printf("L_%d:\n",lb);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2407 printf("\t.size\t%s,L_%d-%s\n",n->nm,lb,n->nm);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2408 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2409 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2410 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2411
917947ffeb7c power pc version
kono
parents:
diff changeset
2412 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2413 global_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2414 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2415 NMTBL *n;
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2416 int init; char *extrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2417 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2418 for(n=ntable;n < &ntable[GSYMS];n++) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2419 if ((n->sc == GVAR) && n->dsp != -1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2420 /* n->dsp = -1 means initialized global */
917947ffeb7c power pc version
kono
parents:
diff changeset
2421 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2422 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
2423 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
2424 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2425 printf(".comm _%s,%d\n",n->nm,size(n->ty));
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2426 } else if ((n->sc==STATIC) && n->dsp != -1) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2427 /* n->dsp = -1 means initialized global */
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2428 if (init==0) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2429 data_mode(0);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2430 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2431 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2432 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2433 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2434 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2435 for(n=ntable;n < &ntable[GSYMS];n++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2436 if (is_code(n)||is_function(n)) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2437 extrn = n->nm;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2438 if (n->sc==EXTRN1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2439 data_mode(0);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2440 printf(".picsymbol_stub\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2441 printf("L_%s$stub:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2442 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2443 printf("\tmflr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2444 printf("\tbcl 20,31,L0$_%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2445 printf("L0$_%s:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2446 printf("\tmflr r11\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2447 printf("\taddis r11,r11,ha16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2448 printf("\tmtlr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2449 printf("\tlwz r12,lo16(L_%s$lazy_ptr-L0$_%s)(r11)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2450 printf("\tmtctr r12\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2451 printf("\taddi r11,r11,lo16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2452 printf("\tbctr\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2453 printf(".data\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2454 printf(".lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2455 printf("L_%s$lazy_ptr:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2456 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2457 printf("\t.long dyld_stub_binding_helper\n");
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2458 } else if (n->sc==FUNCTION||n->sc==CODE) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2459 text_mode();
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2460 printf("\t.set L_%s$stub,_%s\n",extrn,extrn);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2461 data_mode(0);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2462 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
2463 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2464 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2465 }
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2466 init=0;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2467 for(n=ntable;n < &ntable[GSYMS];n++) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2468 if (n->sc == GVAR) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2469 if (init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2470 printf(".data\n");
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2471 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2472 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2473 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
2474 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2475 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2476 init = 0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2477 for(n=ntable;n < &ntable[GSYMS];n++) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2478 if (is_code(n)||is_function(n)) continue;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2479 if (n->sc==EXTRN1) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2480 if(init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2481 printf(".data\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2482 printf(".non_lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2483 init=1;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2484 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2485 printf("L_%s$non_lazy_ptr:\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2486 printf("\t.indirect_symbol _%s\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2487 printf("\t.long\t0\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2488 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2489 }
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 local_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2494 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2495 NMTBL *n;
917947ffeb7c power pc version
kono
parents:
diff changeset
2496 int init;
917947ffeb7c power pc version
kono
parents:
diff changeset
2497 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2498 /* static local variables */
917947ffeb7c power pc version
kono
parents:
diff changeset
2499 for(n=ntable+GSYMS;n < &ntable[GSYMS+LSYMS];n++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2500 if (n->sc == GVAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2501 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2502 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
2503 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
2504 }
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
2505 if (n->dsp != -1) /* initialized static */
da529eab5618 static initialization
kono
parents: 153
diff changeset
2506 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
da529eab5618 static initialization
kono
parents: 153
diff changeset
2507 printf("L_%s$non_lazy_ptr:\n\t.long\t_%s\n",n->nm,n->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2508 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2509 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2510 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2511
917947ffeb7c power pc version
kono
parents:
diff changeset
2512 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2513 text_mode(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
2514 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2515 if (output_mode!=TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2516 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2517 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2518 output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
2519 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2520 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2521
917947ffeb7c power pc version
kono
parents:
diff changeset
2522 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2523 data_mode(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2524 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2525 if (output_mode!=DATA_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2526 printf(".data\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2527 output_mode = DATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
2528 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2529 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2530 if (name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2531 printf("\t.type\t%s,@object\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2532 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2533 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2534
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2535 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2536
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2537 /* floating point */
917947ffeb7c power pc version
kono
parents:
diff changeset
2538
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2539 static int float_one_lib_used=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2540 static char *float_one_lib[] = {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2541 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2542 /* ".literal8", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2543 " .align 3",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2544 "__float_one:",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2545 " .long 1065353216",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2546 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2547 /* ".set L__float_one$non_lazy_ptr,__float_one", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2548 0
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2549 };
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2550 static int float_zero_lib_used=0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2551 static char *float_zero_lib[] = {
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2552 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2553 /* ".literal8", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2554 " .align 3",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2555 "__float_zero:",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2556 " .long 0",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2557 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2558 /* ".set L__float_zero$non_lazy_ptr,__float_zero", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2559 0
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2560 };
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2561
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2562 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
2563 fstore(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2564 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2565 return (d?"stfd":"stfs");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2566 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2567
917947ffeb7c power pc version
kono
parents:
diff changeset
2568 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
2569 fload(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2570 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2571 return d?"lfd":"lfs";
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2572 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2573
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2574 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2575 code_cmp_dregister(int e2,int d)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2576 {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2577 char *frn,*rrn,*grn;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2578 int greg,r;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2579 grn = register_name(greg = get_dregister(d));
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
2580 frn = register_name(e2);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2581 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2582 r = get_ptr_cache(&float_zero);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2583 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2584 printf("\tlfs %s,0(%s)\n",grn,rrn);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2585 printf("\tfcmpu cr0,%s,%s\n",grn,frn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2586 free_register(greg);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2587 return;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2588 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2589
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2590 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2591 code_dregister(int e2,int freg,int d)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2592 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2593 if (freg!=e2) {
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2594 if (is_int_reg(e2)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2595 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2596 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2597 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2598
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2599 void code_dassign_gvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2600 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2601 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2602 r = get_ptr_cache((NMTBL*)cadr(e2));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2603 if (!is_float_reg(freg)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2604 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2605 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2606
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2607 void code_dassign_lvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2608 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2609 lvar_intro(e2);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2610 if (!is_float_reg(freg)) error(-1);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2611 printf("\t%s %s,",fstore(d),fregister_name(freg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2612 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2613 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2614
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2615 void code_dassign(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2616 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2617 if (!is_float_reg(freg)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2618 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2619 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2620
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2621 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2622 code_dassign_dregister(int e2,int d,int freg) {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2623 if (e2!=freg) {
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2624 if (is_int_reg(freg)) error(-1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2625 printf("\tfmr %s,%s\n",fregister_name(e2),fregister_name(freg));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2626 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2627 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2628
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2629 static double d0 = 1.0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2630
917947ffeb7c power pc version
kono
parents:
diff changeset
2631 int
917947ffeb7c power pc version
kono
parents:
diff changeset
2632 code_d1(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2633 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2634 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2635 return (i[1] == 0x3ff00000)?j[0]:j[1];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2636 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2637
917947ffeb7c power pc version
kono
parents:
diff changeset
2638 int
917947ffeb7c power pc version
kono
parents:
diff changeset
2639 code_d2(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
2640 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2641 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2642 return (i[1] == 0x3ff00000)?j[1]:j[0];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2643 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2644
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2645 int
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2646 code_f(double d)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2647 {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2648 float f = d;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2649 int *j = (int *)&f;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2650 return *j;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2651 }
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2652
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2653 void
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2654 code_dconst(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2655 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2656 int lb;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2657 double value = dcadr(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2658 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2659 char *rrn,*frn;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2660 frn = fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2661 if (value==0.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2662 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2663 r = get_ptr_cache(&float_zero);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2664 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2665 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2666 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2667 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2668 if (value==1.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2669 float_one_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2670 r = get_ptr_cache(&float_one);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
2671 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2672 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2673 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2674 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2675 rrn = register_name((r=get_register()));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2676 printf(" \t.data\n\t.align 3\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2677 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2678 printf("L_%d:\n",lb);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2679 if (d) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2680 printf("\t.long\t0x%x,0x%x\n",code_d2(value),code_d1(value));
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2681 } else {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2682 printf("\t.long\t0x%x\n",code_f(value));
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2683 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2684 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2685 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2686 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
2687 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
2688 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2689 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",rrn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2690 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",rrn,lb,code_base,rrn);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2691 if (d) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2692 printf("\tlfd %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2693 } else {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2694 printf("\tlfs %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2695 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2696 free_register(r);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2697 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2698
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2699
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2700 void code_dneg(int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2701 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2702 char *frn = fregister_name(freg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2703 if (is_int_reg(freg)) error(-1);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2704 printf("\tfneg %s,%s\n",frn,frn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2705 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2706
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2707 void code_d2i(int freg0)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2708 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2709 char *frn;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2710 char *crn;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2711 int e2 = new_lvar(size_of_double);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2712
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2713 freg0 = use_double(freg0);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2714 frn = fregister_name(freg0);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2715 creg = use_int(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2716 crn = register_name(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2717
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2718 freg = freg0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2719 free_lvar(e2);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2720 printf("\tfctiwz %s,%s\n",frn,frn);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2721 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2722 printf("\tstfd %s,",frn); lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2723 lvar_intro(e2+size_of_double-size_of_int);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2724 printf("\tlwz %s,",crn); lvar(e2+size_of_double-size_of_int);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2725 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2726
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2727 static int i2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2728 static char *i2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2729 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2730 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2731 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2732 "__i2dLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2733 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2734 " .long -2147483648",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2735 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2736 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2737 "i2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2738 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2739 " bcl 20,31,__i2dL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2740 "__i2dL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2741 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2742 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2743 " xoris r3,r3,0x8000",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2744 " stw r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2745 " lis r0,0x4330",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2746 " stw r0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2747 " lfd f0,-32(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2748 " addis r9,r10,ha16(__i2dLC0-__i2dL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2749 " lfd f1,lo16(__i2dLC0-__i2dL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2750 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2751 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2752 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2753 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2754
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2755 void code_i2d(int creg0)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2756 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2757 i2d_lib_used = 1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2758 clear_ptr_cache();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2759 code_save_stacks();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2760 set_ireg(RET_REGISTER,1);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2761 printf("\tbl i2d_\n");
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2762 set_freg(RET_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2763 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2764
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2765 static int d2u_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2766 static char *d2u_lib[] = {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2767 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2768 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2769 "__d2uLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2770 " .long 1105199104",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2771 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2772 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2773 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2774 "d2u_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2775 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2776 " bcl 20,31,__d2uL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2777 "__d2uL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2778 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2779 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2780 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2781 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2782 " fcmpu cr0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2783 " cror 2,1,2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2784 " beq- cr0,__d2uL2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2785 " fctiwz f0,f1",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2786 " stfd f0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2787 " lwz r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2788 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2789 "__d2uL2:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2790 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2791 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2792 " fsub f0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2793 " fctiwz f0,f0",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2794 " stfd f0,-24(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2795 " lwz r3,-20(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2796 " xoris r3,r3,0x8000",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2797 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2798 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2799 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2800
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2801 void code_d2u(int freg0)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2802 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2803 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2804 clear_ptr_cache();
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2805 d2u_lib_used=1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2806 set_freg(RET_FREGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2807 printf("\tbl d2u_\n");
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2808 set_ireg(RET_REGISTER,0);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2809 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2810
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2811 static int u2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2812 static char *u2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2813 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2814 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2815 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2816 "__u2dLC1:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2817 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2818 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2819 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2820 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2821 "u2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2822 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2823 " bcl 20,31,__u2dL2$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2824 "__u2dL2$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2825 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2826 " mtlr r0",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2827 " stw r3,-28(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2828 " lis r0,0x4330",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2829 " stw r0,-32(r30)",
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2830 " lfd f0,-32(r30)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2831 " addis r9,r10,ha16(__u2dLC1-__u2dL2$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2832 " lfd f1,lo16(__u2dLC1-__u2dL2$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2833 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2834 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2835 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2836 };
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2837
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2838 void code_u2d(int creg0)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2839 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2840 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2841 clear_ptr_cache();
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2842 u2d_lib_used = 1;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2843 set_ireg(RET_REGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2844 printf("\tbl u2d_\n");
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2845 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2846 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2847
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2848 void code_d2f(int freg) { }
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2849 void code_f2d(int freg) { }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2850 void code_f2i(int freg) { code_d2i(freg); }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2851 void code_f2u(int freg) { code_d2u(freg); }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2852 void code_i2f(int creg) { code_i2d(creg); }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2853 void code_u2f(int creg) { code_u2d(creg); }
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2854
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2855 void code_drgvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2856 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2857 int r;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2858 r = get_ptr_cache((NMTBL*)cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2859 printf("\t%s %s,0(%s)\n",fload(d),fregister_name(freg),register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2860 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2861
917947ffeb7c power pc version
kono
parents:
diff changeset
2862
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2863 void code_drlvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2864 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2865 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2866 printf("\t%s %s,",fload(d),fregister_name(freg)); lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2867 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2868
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2869 void code_cmp_drgvar(int e2,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2870 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2871 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2872 char *frn=fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2873 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2874 char *grn=fregister_name(g);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
2875 r = get_ptr_cache((NMTBL*)cadr(e2));
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2876 printf("\t%s %s,0(%s)\n",fload(1),grn,register_name(r));
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2877 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2878 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2879 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2880
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2881 void code_cmp_drlvar(int e2,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2882 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2883 char *frn=fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2884 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2885 char *grn=fregister_name(g);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2886
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2887 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2888 printf("\t%s %s,",fload(1),grn); lvar(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2889 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2890 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2891 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2892
917947ffeb7c power pc version
kono
parents:
diff changeset
2893 void dtosop(int op,int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2894 {
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
2895 char *opn="";
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2896 char *frn=fregister_name(freg);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2897 char *grn=fregister_name(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2898 switch(op) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2899 case FADD:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2900 case DADD: opn="fadd"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2901 case FSUB:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2902 case DSUB: opn="fsub"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2903 case FDIV:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2904 case DDIV: opn="fdiv"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2905 case FMUL:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2906 case DMUL: opn="fmul"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2907 case FCMP:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2908 case DCMP:
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2909 printf("\tfcmpu cr0,%s,%s\n",frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2910 free_register(e1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2911 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2912 case FCMPGE:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2913 case DCMPGE:
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2914 printf("\tfcmpu cr7,%s,%s\n",frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2915 free_register(e1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2916 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2917 default:
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
2918 error(-1); return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2919 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2920 printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2921 free_register(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2922 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2923
917947ffeb7c power pc version
kono
parents:
diff changeset
2924 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2925 code_dassop(int op,int d) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2926 /* we have lvalue in creg, applied floating value is in freg */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2927 int xreg=emit_dpop(d);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2928 char *crn=register_name(creg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2929 char *frn;
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2930 creg = d?use_double(creg):use_float(creg);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2931 frn =fregister_name(freg);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2932
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2933 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2934 dtosop(op,xreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2935 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2936 emit_dpop_free(xreg,d);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2937 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2938
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2939
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2940 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2941 code_dpreinc(int e1,int e2,int d,int reg) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2942 char *frn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2943 char *crn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2944 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2945 char *grn,*drn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2946 int r;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2947
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2948 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2949 error(-1); /* unspported now */
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2950 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2951 g_expr(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2952
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2953 float_one_lib_used=1;
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2954 r = get_ptr_cache(&float_one);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2955 drn=register_name(r);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2956
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2957 crn=register_name(creg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2958
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2959 creg = d?use_double(creg):use_float(creg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2960 frn=fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2961 grn=fregister_name(g=get_dregister(d));
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2962
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2963 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2964 printf("\tlfs %s,0(%s)\n",grn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2965 if (caddr(e1)>0)
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2966 printf("\tfadd %s,%s,%s\n",frn,frn,grn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2967 else
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2968 printf("\tfsub %s,%s,%s\n",frn,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2969 if (!is_float_reg(freg)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2970 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2971 free_register(g);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2972 creg = freg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2973 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2974
917947ffeb7c power pc version
kono
parents:
diff changeset
2975 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2976 code_dpostinc(int e1,int e2,int d,int reg) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2977 char *frn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2978 char *crn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2979 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2980 char *grn,*drn;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2981 int r;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2982
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2983 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2984 error(-1); /* unspported now */
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
2985 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2986 g_expr(e2);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2987
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2988 crn=register_name(creg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2989
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2990 float_one_lib_used=1;
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2991 r = get_ptr_cache(&float_one);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2992 drn=register_name(r);
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2993
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
2994 creg = d?use_double(creg):use_float(creg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
2995 frn=fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2996 grn=fregister_name(g=get_dregister(d));
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
2997
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2998 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2999 printf("\tlfs %s,0(%s)\n",grn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3000 if (caddr(e1)>0)
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3001 printf("\tfadd %s,%s,%s\n",grn,frn,grn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3002 else
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3003 printf("\tfsub %s,%s,%s\n",grn,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3004 if (!is_float_reg(freg)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3005 printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3006 free_register(g);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3007 creg = freg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3008 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3009
917947ffeb7c power pc version
kono
parents:
diff changeset
3010 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3011 drexpr(int e1, int e2,int l1, int op)
917947ffeb7c power pc version
kono
parents:
diff changeset
3012 {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3013 g_expr(list3(((op==DOP+GE)?DCMPGE:DCMP),e1,e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3014 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3015 case DOP+GE:
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3016 case FOP+GE:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3017 printf("\tcror 2,29,30\n");
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3018 printf("\tbne\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3019 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3020 case DOP+GT:
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3021 case FOP+GT:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3022 printf("\tble\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3023 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3024 case DOP+EQ:
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3025 case FOP+EQ:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3026 printf("\tbne\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3027 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3028 case DOP+NEQ:
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3029 case FOP+NEQ:
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3030 printf("\tbeq\tcr0,L_%d\n",l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3031 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3032 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3033 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3034
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3035 int emit_dpop(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3036 {
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
3037 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3038 xreg=pop_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3039 if (xreg<= -REG_LVAR_OFFSET) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3040 reg = get_dregister(d);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3041 code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
3042 free_lvar(REG_LVAR_OFFSET+xreg);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
3043 xreg=reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3044 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3045 return xreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3046 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3047
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3048 void emit_dpop_free(int e1,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3049 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3050 free_register(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3051 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3052
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3053 void emit_dpush(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3054 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3055 int new_reg;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3056 if (freg_sp>MAX_MAX) error(-1);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3057 new_reg = get_dregister(1);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3058 freg_stack[freg_sp++] = freg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3059 creg = freg = new_reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3060 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3061
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3062 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3063
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3064 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3065
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3066
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3067 /* 64bit int part */
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3068
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3069 void lrexpr(int e1, int e2,int l1, int op)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3070 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3071 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3072
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3073 int lpop_register()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3074 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3075 return 0;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3076 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3077
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3078 int emit_lpop()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3079 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3080 return 0;
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3081 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3082
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3083 void code_lregister(int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3084 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3085
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3086 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3087
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3088 void code_cmp_lregister(int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3089 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3090
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3091 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3092
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3093 void code_cmp_lrgvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3094 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3095
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3096 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3097
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3098 void code_cmp_lrlvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3099 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3100
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3101 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3102
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3103 void code_lassign(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3104 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3105
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3106 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3107
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3108 void code_lassign_gvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3109 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3110
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3111 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3112
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3113 void code_lassign_lvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3114 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3115
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3116 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3117
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3118 void code_lassign_lregister(int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3119 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3120
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3121 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3122
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3123 static long long ll0 = 1LL;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3124
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3125 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3126 code_l1(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3127 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3128 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3129 return (i[1] == 1)?j[1]:j[0];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3130 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3131
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3132 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3133 code_l2(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3134 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3135 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3136 return (i[1] == 1)?j[0]:j[1];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3137 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3138
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3139 void code_lconst(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3140 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3141
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3142 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3143
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3144 void code_lneg(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3145 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3146
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3147 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3148
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3149 void code_lrgvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3150 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3151
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3152 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3153
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3154 void code_lrlvar(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3155 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3156
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3157 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3158
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3159 void ltosop(int e1,int e2)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3160 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3161
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3162 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3163
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3164 void emit_lpop_free(int e1)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3165 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3166
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3167 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3168
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3169 void emit_lpush()
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3170 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3171
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3172 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3173
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3174 void code_i2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3175 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3176
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3177 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3178
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3179 void code_i2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3180 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3181
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3182 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3183
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3184 void code_u2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3185 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3186
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3187 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3188
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3189 void code_u2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3190 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3191
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3192 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3193
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3194 void code_ll2i(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3195 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3196
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3197 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3198
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3199 void code_ll2u(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3200 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3201
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3202 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3203
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3204 void code_ull2i(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3205 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3206
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3207 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3208
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3209 void code_ull2u(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3210 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3211
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3212 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3213
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3214 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3215 void code_d2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3216 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3217
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3218 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3219
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3220 void code_d2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3221 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3222
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3223 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3224
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3225 void code_f2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3226 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3227
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3228 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3229
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3230 void code_f2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3231 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3232
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3233 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3234
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3235 void code_ll2d(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3236 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3237
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3238 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3239
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3240 void code_ll2f(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3241 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3242
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3243 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3244
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3245 void code_ull2d(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3246 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3247
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3248 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3249
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3250 void code_ull2f(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3251 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3252
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3253 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3254
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3255 void code_ull2ll(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3256 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3257
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3258 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3259
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3260 void code_ull2ull(int creg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3261 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3262
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3263 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3264
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3265 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3266
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3267
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3268 void code_lpreinc(int e1,int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3269 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3270
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3271 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3272
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3273 void code_lpostinc(int e1,int e2,int reg)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3274 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3275
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3276 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3277
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3278 void code_lassop(int op)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3279 {
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3280
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3281 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3282
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3283
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3284 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3285
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3286 void
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3287 code_save_stacks()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3288 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3289 int i,reg;
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3290 for(i=0;i<reg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3291 if ((reg=reg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3292 code_assign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3293 (reg_stack[i]=new_lvar(size_of_int)),reg,0);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3294 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3295 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3296 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3297 #if FLOAT_CODE
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3298 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3299 if ((reg=freg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3300 code_dassign_lvar(
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3301 (freg_stack[i]=new_lvar(size_of_double)),reg,1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3302 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3303 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3304 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3305 #endif
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3306 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3307
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3308 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3309 emit_lib(char *p[])
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3310 {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3311 while(*p) {
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3312 printf("%s\n",*p++);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3313 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3314 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3315
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3316 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3317 code_closing()
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3318 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3319 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3320 if (d2u_lib_used) emit_lib(d2u_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3321 if (u2d_lib_used) emit_lib(u2d_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3322 if (float_one_lib_used) emit_lib(float_one_lib);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3323 if (float_zero_lib_used) emit_lib(float_zero_lib);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3324 if (i2d_lib_used) emit_lib(i2d_lib);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3325 #endif
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3326 global_table();
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3327 /* printf("\t.ident \"Micro-C compiled\"\n"); */
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3328 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3329
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3330 /* end */
917947ffeb7c power pc version
kono
parents:
diff changeset
3331