annotate mc-code-powerpc.c @ 382:832e1f6bba82

ARM wrote all code. Check compile error.
author kono
date Mon, 19 Jul 2004 16:30:11 +0900 (2004-07-19)
parents 91849fdeea60
children 5b76a2bc1177
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
1 /* Micro-C Code Generation Part for Power PC (Mac OS X) */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2 /* $Id$ */
917947ffeb7c power pc version
kono
parents:
diff changeset
3
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
4 #include <stdio.h>
89
917947ffeb7c power pc version
kono
parents:
diff changeset
5 #include "mc.h"
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
6 #include "mc-parse.h"
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
7 #include "mc-code.h"
89
917947ffeb7c power pc version
kono
parents:
diff changeset
8 #include "mc-codegen.h"
917947ffeb7c power pc version
kono
parents:
diff changeset
9
173
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
10 char *l_include_path[] = {
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
11 "/usr/include/",
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
12 0
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
13 };
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
14
324
575481408653 minor fix
kono
parents: 320
diff changeset
15 // __builtin_expect(a,t) branch prediction
575481408653 minor fix
kono
parents: 320
diff changeset
16
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
17 static
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
18 char *init_src0 = "\
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
19 #define __ppc__ 1\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
20 #define __BIG_ENDIAN__ 1\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
21 #define __STDC__ 1\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
22 #define __builtin_va_list int\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
23 #define __builtin_va_start(ap,arg) ap=(((int)(&arg))+sizeof(arg))\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
24 #define __builtin_va_arg(ap,type) (*((type *)ap)++)\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
25 #define alloca __builtin_alloca\n\
324
575481408653 minor fix
kono
parents: 320
diff changeset
26 #define __builtin_expect(a,t) a\n\
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
27 ";
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
28
89
917947ffeb7c power pc version
kono
parents:
diff changeset
29 #define TEXT_EMIT_MODE 0
917947ffeb7c power pc version
kono
parents:
diff changeset
30 #define DATA_EMIT_MODE 1
917947ffeb7c power pc version
kono
parents:
diff changeset
31 #define RODATA_EMIT_MODE 2
917947ffeb7c power pc version
kono
parents:
diff changeset
32
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
33 static void data_mode(char *name);
263
c922bade771d MIPS go on...
kono
parents: 260
diff changeset
34 static void text_mode();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
35 static void ld_indexx(int byte, int n, int xreg,int reg,int sign);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
36 static void local_table(void);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
37 static void shift(char *op, int creg,int reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
38 static int struct_push(int e4,int t,int arg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
39
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
40
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
41 static int creg;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
42
89
917947ffeb7c power pc version
kono
parents:
diff changeset
43 static int output_mode = TEXT_EMIT_MODE;
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
44 int data_alignment = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
45
917947ffeb7c power pc version
kono
parents:
diff changeset
46 static int code_disp_label;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
47 static int code_setup;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
48 static int r1_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
49 static int lvar_offset_label;
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
50 static int max_func_arg_label;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
51
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
52 static int reg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
53 static int freg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
54
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
55 static int freg,ireg,lreg;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
56
238
d64e9a6a66bd ia32 long long code written.
kono
parents: 237
diff changeset
57 int code_lassop_p = 1;
d64e9a6a66bd ia32 long long code written.
kono
parents: 237
diff changeset
58
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
59 #define SIZE_OF_INT 4
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
60 #define SIZE_OF_SHORT 2
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
61 #define SIZE_OF_FLOAT 4
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
62 #define SIZE_OF_DOUBLE 8
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
63 #define SIZE_OF_LONGLONG 8
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
64 #define ENDIAN 1
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
65
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
66 static int reg_sp; /* REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
67 static int reg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
68
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
69 /* floating point registers */
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
70
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
71 static int freg_sp; /* floating point REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
72 static int freg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
73
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
74 static int lreg_sp; /* longlong REGister Stack-Pointer */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
75 static int lreg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
76
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
77 #define REG_fp 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
78 #define REG_sp 30
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
79 #define REG_VAR_BASE 29
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
80 #define REG_VAR_MIN 18
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
81 #define MIN_TMP_REG 3
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
82 #define MAX_TMP_REG 11
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
83
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
84 #define PTRC_REG 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
85
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
86 #define FREG_VAR_BASE 31
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
87 #define FREG_VAR_MIN 20
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
88 #define MIN_TMP_FREG 1
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
89 #define MAX_TMP_FREG 14
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
90
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
91 int MAX_REGISTER=30; /* PowerPC�Υ쥸������10�ĤޤǻȤ�*/
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
92 int MAX_FREGISTER=31;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
93 #define REAL_MAX_REGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
94 #define REAL_MAX_FREGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
95 #define REAL_MAX_LREGISTER 16
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
96
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
97 #define FREG_OFFSET REAL_MAX_REGISTER
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
98 #define LREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
99
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
100 #define RET_REGISTER 3
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
101 #define RET_FREGISTER (1+FREG_OFFSET)
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
102 #define RET_LREGISTER_H 3 /* high word */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
103 #define RET_LREGISTER_L 4 /* low word */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
104 #define RET_LREGISTER LREG_OFFSET
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
105
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
106 int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
107 int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
108 int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
109 int MAX_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
110 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
111 int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
112
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
113 static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
114 REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
115 static int regv_h0[REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
116 static int regv_l0[REAL_MAX_LREGISTER];
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
117 #define regv_h(i) regv_h0[(i)-LREG_OFFSET]
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
118 #define regv_l(i) regv_l0[(i)-LREG_OFFSET]
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
119
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
120 static int *regs = powerpc_regs;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
121
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
122 #define CREG_REGISTER (MAX_TMP_REG)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
123 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
124 #define LREG_LREGISTER (MAX_TMP_REG+LREG_OFFSET)
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
125
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
126
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
127 static int max_reg_var, max_freg_var;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
128
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
129 static char *reg_name[] = {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
130 "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
131 "r10","r11","r12","r13","r14","r15","r16","r17","r18","r19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
132 "r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
133 "r30","r31",
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
134 "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
135 "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
136 "f20","f21","f22","f23","f24","f25","f26","f27","f28","f29",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
137 "f30","f31"
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
138 };
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
139
260
9843979a270e mips fix
kono
parents: 259
diff changeset
140 #define round4(i) ((i+(SIZE_OF_INT-1))&~(SIZE_OF_INT-1))
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
141
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
142 #define register_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
143 #define fregister_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
144 #define lregister_name_low(i) reg_name[regv_l(i)]
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
145 #define lregister_name_high(i) reg_name[regv_h(i)]
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
146
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
147 char *r(i) { return register_name(i); }
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
148 char *f(i) { return fregister_name(i); }
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
149 char *ll(i) { return lregister_name_low(i); }
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
150 char *lh(i) { return lregister_name_high(i); }
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
151
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
152 #define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
153 #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
154 #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
155
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
156 #define use_int(reg) if (reg==USE_CREG) reg=use_int0()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
157 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
158 int use_int0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
159 int i = creg;
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
160 if (!i||!ireg||!is_int_reg(i)) {
338
7fe7ce0a791f bit-field done for IA32, PowerPC, MIPS.
kono
parents: 336
diff changeset
161 if (lreg) { if (regs[lreg]) free_register(lreg); lreg = 0; }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
162 if (!ireg) ireg = get_register();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
163 // else if (ireg!=i) free_register(i);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
164 i = ireg;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
165 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
166 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
167 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
168 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
169 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
170
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
171 #if LONGLONG_CODE
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
172 #define use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0()
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
173
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
174 static
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
175 int use_longlong0() {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
176 int i = creg;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
177 if (!is_longlong_reg(i)) {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
178 if (ireg) { free_register(ireg); ireg=0; }
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
179 if (!lreg||!regs[lreg]) lreg = get_lregister();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
180 // else if (lreg!=i) free_register(i);
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
181 i = lreg;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
182 }
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
183 if (!regv_l(i)) regv_l(i) = get_register();
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
184 if (!regv_h(i)) regv_h(i) = get_register();
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
185 if (!regs[i]) regs[i]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
186 if (!regs[regv_l(i)]) regs[regv_l(i)]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
187 if (!regs[regv_h(i)]) regs[regv_h(i)]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
188 creg = i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
189 return i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
190 }
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
191 #endif
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
192
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
193
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
194 #if FLOAT_CODE
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
195 #define use_float(d,reg) if (reg==USE_CREG) reg=d?use_double0():use_float0()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
196 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
197 int use_float0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
198 int i = creg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
199 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
200 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
201 if (!freg) freg = get_dregister(0);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
202 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
203 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
204 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
205 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
206 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
207 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
208 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
209 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
210 int use_double0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
211 int i = creg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
212 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
213 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
214 if (!freg) freg = get_dregister(1);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
215 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
216 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
217 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
218 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
219 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
220 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
221 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
222 #endif
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
223
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
224
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
225 #if FLOAT_CODE
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
226 static
348
e77b3a7002ad name table reconfigure compiled. debug start.
kono
parents: 345
diff changeset
227 NMTBL float_zero = {"_float_zero",0,STATIC,FLOAT,0};
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
228 static
348
e77b3a7002ad name table reconfigure compiled. debug start.
kono
parents: 345
diff changeset
229 NMTBL float_one = {"_float_one",0,STATIC,FLOAT,0};
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
230
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
231
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
232 static char * fload(int d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
233 static int code_d1(double d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
234 static int code_d2(double d);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
235 #endif
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
236 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
237 static int code_l1(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
238 static int code_l2(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
239 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
240
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
241 static void code_save_stacks();
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
242 static void code_save_input_registers(int dots);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
243 static void set_ireg(int,int);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
244 static void set_freg(int,int);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
245 static void set_lreg(int,int);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
246 static void jcond(int l, char cond);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
247
153
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
248 static int max_func_args;
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
249 static int my_func_args;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
250 #define ARG_LVAR_OFFSET 0x10000000
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
251
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
252 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
253
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
254 r0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
255 r3-r10 input register
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
256 r22-r29 saved register variable (input register for code segment)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
257 r30 stack pointer
917947ffeb7c power pc version
kono
parents:
diff changeset
258 r31 0
917947ffeb7c power pc version
kono
parents:
diff changeset
259 r1 frame pointer
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
260
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
261 f0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
262 f1-r8 input register
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
263 f24-f31 saved register variable
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
264
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
265 function call stack frame
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
266 <-------r1_offset------------------------------>
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
267 <------------lvar_offset0------>
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
268 <--lvar_offset-->
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
269 r+ +------------+---+---------------+----------+--------------+----+ -
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
270 callee arg xx register save local caller arg xx
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
271 reg_save disp max_func_args*SIZE_OF_INT
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
272 lvar>0 lvar<0 lvar>0x1000 0000
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
273
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
274 code segment stack frame
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
275
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
276 * goto��ƤӽФ����ؿ���r1 ! r1(goto����r1)
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
277 # * r30 <---r1_offset---------> r1
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
278 r+ +----------+--+----------+----------------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
279 cousin arg xx reg save !callee arg !code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
280 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
281 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
282 *SIZE_OF_INT *SIZE_OF_INT
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
283
89
917947ffeb7c power pc version
kono
parents:
diff changeset
284 */
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
285 int arg_offset = 24; int arg_offset1 = 24; int disp_offset = -12;
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
286 // #define func_disp_offset 60
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
287 #define func_disp_offset 68
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
288 #define r1_offset func_disp_offset+12
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
289 int code_disp_offset = 0; int jump_offset = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
290 #define CODE_LVAR l+code_disp_offset
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
291 #define CODE_CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
292 #define FUNC_LVAR l+disp_offset
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
293 #define CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
294 #define CALLEE_ARG l+arg_offset
89
917947ffeb7c power pc version
kono
parents:
diff changeset
295
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
296 void
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
297 code_offset_set()
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
298 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
299 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
300 int l;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
301 #endif
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
302 int lvar_offsetv = -disp+max_func_args*SIZE_OF_INT+func_disp_offset;
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
303 // int r1_offsetv = -disp+max_func_args*SIZE_OF_INT-reg_save+r1_offset;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
304 int r1_offsetv = lvar_offsetv-reg_save+12;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
305 printf(".set L_%d,%d\n",lvar_offset_label,r1_offsetv-lvar_offsetv);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
306 printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
307 if (max_func_arg_label) {
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
308 printf(".set L_%d,%d\n",max_func_arg_label,max_func_args*SIZE_OF_INT+24);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
309 max_func_arg_label = 0;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
310 }
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
311
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
312 printf("# reg_save %d\n",reg_save);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
313 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
314 printf("# function %s\n",fnptr->nm);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
315 l = ARG_LVAR_OFFSET;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
316 printf("# offset call0\t%d\n",CALLER_ARG);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
317 l = ARG_LVAR_OFFSET+max_func_args*SIZE_OF_INT;
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
318 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
319 l = disp;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
320 printf("# offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
321 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
322 printf("# offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
323 l = -reg_save;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
324 printf("# offset regs\t%d\n",FUNC_LVAR+lvar_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
325 printf("# offset r1off\t%d\n",r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
326 l = 0;
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
327 printf("# offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
328 l = my_func_args;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
329 printf("# offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
330 #endif
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
331 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
332
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
333 static int large_offset_reg;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
334
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
335 static void
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
336 lvar(int l)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
337 {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
338 char *rn;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
339 if (!large_offset_reg) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
340 if (fnptr->sc==CODE) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
341 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
342 printf("lo16(%d)(r1)\n",CODE_CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
343 } else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
344 printf("lo16(%d)(r30)\n",CODE_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
345 } else if (l<0) { /* local variable */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
346 printf("lo16(%d)(r30)\n",FUNC_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
347 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
348 printf("lo16(%d)(r1)\n",CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
349 } else { /* callee's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
350 printf("lo16(%d+L_%d)(r30)\n",CALLEE_ARG,lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
351 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
352 } else {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
353 rn = register_name(large_offset_reg);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
354 if (fnptr->sc==CODE) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
355 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
356 printf("lo16(%d)(%s)\n",CODE_CALLER_ARG,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
357 } else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
358 printf("lo16(%d)(%s)\n",CODE_LVAR,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
359 } else if (l<0) { /* local variable */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
360 printf("lo16(%d)(%s)\n",FUNC_LVAR,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
361 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
362 printf("lo16(%d)(%s)\n",CALLER_ARG,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
363 } else { /* callee's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
364 printf("lo16(%d+L_%d)(%s)\n",CALLEE_ARG,lvar_offset_label,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
365 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
366 free_register(large_offset_reg);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
367 }
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
368 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
369
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
370 /* if size of local variables / input variables is more then 64k,
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
371 lo16 does not work. We have to use ha16 also. But we can't know
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
372 the exact size in one path compile. We may safely use lvar16ha
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
373 if disp or max_func_args > 32k. Of course this is redundant for
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
374 smaller offset. But who cares who use very large local variables?
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
375 */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
376
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
377 #define LARGE_OFFSET(l) (l<-32000||l>32000)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
378
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
379 static void
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
380 lvar_intro(int l)
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
381 {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
382 char *rn;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
383 large_offset_reg=0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
384 if (fnptr->sc==CODE) {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
385 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
386 if (LARGE_OFFSET(CODE_CALLER_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
387 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
388 printf("\taddis %s,r1,ha16(%d)\n",rn,CODE_CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
389 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
390 } else {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
391 if (LARGE_OFFSET(CODE_LVAR)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
392 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
393 printf("\taddis %s,r30,ha16(%d)\n",rn,CODE_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
394 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
395 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
396 } else if (l<0) { /* local variable */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
397 if (LARGE_OFFSET(FUNC_LVAR)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
398 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
399 printf("\taddis %s,r30,ha16(%d)\n",rn,FUNC_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
400 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
401 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
402 if (LARGE_OFFSET(CALLER_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
403 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
404 printf("\taddis %s,r1,ha16(%d)\n",rn,CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
405 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
406 } else { /* callee's arguments */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
407 if (LARGE_OFFSET(CALLEE_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
408 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
409 printf("\taddis %s,r30,lo16(%d+L_%d)\n",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
410 rn,CALLEE_ARG,lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
411 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
412 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
413 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
414
917947ffeb7c power pc version
kono
parents:
diff changeset
415
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
416 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
417 code_lvar(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
418 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
419 lvar_intro(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
420 printf("\tla %s,",register_name(reg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
421 lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
422 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
423
89
917947ffeb7c power pc version
kono
parents:
diff changeset
424 void
917947ffeb7c power pc version
kono
parents:
diff changeset
425 code_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
426 {
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
427 /* called only once */
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
428
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
429 init_src = init_src0;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
430 size_of_int = SIZE_OF_INT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
431 size_of_short = SIZE_OF_SHORT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
432 size_of_float = SIZE_OF_FLOAT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
433 size_of_double = SIZE_OF_DOUBLE;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
434 size_of_longlong = SIZE_OF_LONGLONG;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
435 endian = ENDIAN;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
436
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
437 regv_l(RET_LREGISTER) = RET_LREGISTER_L;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
438 regv_h(RET_LREGISTER) = RET_LREGISTER_H;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
439 }
917947ffeb7c power pc version
kono
parents:
diff changeset
440
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
441 extern void
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
442 emit_reinit()
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
443 {
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
444 /* called for each file */
328
7ecb023d29b8 macro/codegen reorganization done.
kono
parents: 327
diff changeset
445 /* heap is initialized here, setup ptr cache free list */
7ecb023d29b8 macro/codegen reorganization done.
kono
parents: 327
diff changeset
446 init_ptr_cache();
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
447 }
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
448
89
917947ffeb7c power pc version
kono
parents:
diff changeset
449 void
917947ffeb7c power pc version
kono
parents:
diff changeset
450 gexpr_code_init(void){
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
451 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
452
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
453 void
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
454 code_gexpr(int e){
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
455 // if (is_int_reg(creg) && creg!=ireg) error(-1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
456 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
457
89
917947ffeb7c power pc version
kono
parents:
diff changeset
458
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
459 void
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
460 code_arg_register(NMTBL *fnptr)
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
461 {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
462 int args = fnptr->dsp;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
463 NMTBL *n;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
464 int reg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
465 int freg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
466 int type;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
467 int reg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
468 int i;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
469 int is_code0 = is_code(fnptr);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
470 int dots;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
471
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
472 function_type(fnptr->ty,&dots);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
473 while (args) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
474 /* process in reverse order */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
475 n = (NMTBL*)caddr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
476 type = n->ty;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
477 if (scalar(type)) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
478 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
479 n->sc = REGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
480 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
481 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
482 reg_var++;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
483 cadddr(args)=SIZE_OF_INT;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
484 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
485 } else if (type==FLOAT) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
486 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
487 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
488 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
489 regs[n->dsp]= INPUT_REG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
490 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
491 cadddr(args)=size(type);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
492 }
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
493 } else if (type==DOUBLE) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
494 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
495 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
496 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
497 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
498 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
499 cadddr(args)=size(type);
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
500 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
501 } else if (type==LONGLONG||type==ULONGLONG) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
502 if ((reg = get_input_lregister_var(reg_var,n,is_code0))) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
503 n->sc = LREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
504 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
505 regs[i=n->dsp]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
506 regs[regv_l(i)]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
507 regs[regv_h(i)]= INPUT_REG;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
508 reg_var+=2;
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
509 cadddr(args)=size(type);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
510 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
511 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
512 args = cadr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
513 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
514 if (is_function(fnptr))
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
515 code_save_input_registers(dots);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
516 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
517
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
518
89
917947ffeb7c power pc version
kono
parents:
diff changeset
519 int
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
520 get_register(void)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
521 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
522 int i,j,reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
523 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
524 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
525 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
526 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
527 }
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
528 /* PTR_CACHE ��Ĥ֤� */
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
529 if ((i=last_ptr_cache())) {
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
530 clear_ptr_cache_reg(i);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
531 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
532 return i; /* ���ξ���ɽ���ֹ���֤� */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
533 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
534 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
535 for(i=0;i<reg_sp;i++) {
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
536 if ((reg=reg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
537 code_assign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
538 (j=new_lvar(SIZE_OF_INT)),reg,0);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
539 reg_stack[i]= j-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
540 return reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
541 }
917947ffeb7c power pc version
kono
parents:
diff changeset
542 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
543 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
544 /* search register stack */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
545 for(i=0;i<lreg_sp;i++) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
546 if ((reg=lreg_stack[i])>=0) {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
547 code_lassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
548 (j=new_lvar(SIZE_OF_LONGLONG)),reg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
549 lreg_stack[i]= j-REG_LVAR_OFFSET;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
550 free_register(reg);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
551 return get_register();
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
552 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
553 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
554 #endif
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
555 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
556 reg =REG_VAR_BASE-i;
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
557 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
558 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
559 if (i>max_reg_var) max_reg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
560 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
561 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
562 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
563 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
564 error(HPERR); return creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
565 }
917947ffeb7c power pc version
kono
parents:
diff changeset
566
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
567 #if 0
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
568 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
569 get_register(void)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
570 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
571 int i = get_register0();
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
572 printf("# get_register %d\n",i);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
573 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
574 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
575 #endif
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
576
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
577 int
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
578 pop_register(void)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
579 { /* �쥸���������ͤ���Ф� */
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
580 return reg_stack[--reg_sp];
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
581 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
582
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
583 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
584 int
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
585 get_dregister(int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
586 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
587 int i,reg;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
588 for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
589 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
590 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
591 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
592 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
593 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
594 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
595 if ((reg=freg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
596 code_dassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
597 (freg_stack[i]=new_lvar(SIZE_OF_DOUBLE)),reg,1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
598 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
599 return reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
600 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
601 }
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
602 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
603 reg =FREG_VAR_BASE-i+FREG_OFFSET;
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
604 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
605 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
606 if (i>max_freg_var) max_freg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
607 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
608 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
609 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
610 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
611 error(REG_ERR); return freg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
612 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
613
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
614 #if 0
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
615 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
616 get_dregister(int d)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
617 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
618 int i = get_dregister0(d);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
619 printf("# get_dregister %d\n",i);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
620 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
621 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
622 #endif
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
623
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
624 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
625 pop_fregister(void)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
626 { /* �쥸���������ͤ���Ф� */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
627 return freg_stack[--freg_sp];
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
628 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
629 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
630
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
631 int
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
632 get_lregister0()
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
633 {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
634 int i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
635 for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
636 if (regs[i]==0) {
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
637 // printf("# get_lregister %d\n",i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
638 return i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
639 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
640 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
641 return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
642 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
643
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
644 int
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
645 get_lregister()
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
646 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
647 int h,l,i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
648 i = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
649 if (i==-1) return -1;
220
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
650 h = get_register();
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
651 if (h==-1) return -1;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
652 regv_h(i) = h;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
653 l = get_register();
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
654 if (l==-1) { free_register(h); return -1; }
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
655 regv_l(i) = l;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
656 regs[i]=USING_REG;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
657 return i;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
658 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
659
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
660 int
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
661 get_lregister_var(NMTBL *n)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
662 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
663 int i,j,ll;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
664 int max_reg_var_save=max_reg_var;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
665 ll = get_lregister0();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
666 if (ll==-1) goto not_found;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
667 if (regs[ll]==0) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
668 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
669 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
670 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
671 regs[REG_VAR_BASE-i]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
672 if (i>max_reg_var) max_reg_var=i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
673 for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
674 if (! regs[REG_VAR_BASE-j]) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
675 /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
676 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
677 regs[REG_VAR_BASE-j]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
678 if (j>max_reg_var) max_reg_var=j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
679 /* ���ξ���ɽ���ֹ���֤� */
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
680 regs[ll]=USING_REG;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
681 regv_l(ll) = REG_VAR_BASE-j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
682 regv_h(ll) = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
683 return list3(LREGISTER,ll,(int)n);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
684 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
685 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
686 /* �ҤȤĤ����ʤ��ä� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
687 regs[REG_VAR_BASE-i]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
688 max_reg_var=max_reg_var_save;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
689 goto not_found;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
690 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
691 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
692 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
693 not_found:
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
694 return list2(LVAR,new_lvar(SIZE_OF_LONGLONG));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
695 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
696
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
697 void
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
698 emit_pop_free(int xreg)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
699 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
700 if (xreg>=0)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
701 free_register(xreg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
702 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
703
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
704 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
705
89
917947ffeb7c power pc version
kono
parents:
diff changeset
706 free_register(int i) { /* ����ʤ��ʤä��쥸�������� */
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
707 // printf("# free_register %d\n",i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
708 regs[i]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
709 if (is_longlong_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
710 regs[regv_l(i)]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
711 regs[regv_h(i)]=0;
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
712 //regv_l(i)=0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
713 //regv_h(i)=0;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
714 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
715 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
716
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
717 extern void
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
718 use_ptr_cache(int r)
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
719 {
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
720 regs[r]=PTRC_REG;
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
721 }
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
722
89
917947ffeb7c power pc version
kono
parents:
diff changeset
723 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
724 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
725 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
726 if (is_code) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
727 if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
728 i = FREG_VAR_BASE-i+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
729 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
730 if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
731 i = i+MIN_TMP_FREG+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
732 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
733 return list3(DREGISTER,i,(int)n);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
734 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
735
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
736 int
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
737 get_input_lregister_var(int i,NMTBL *n,int is_code)
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
738 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
739 int ll;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
740 ll = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
741 if (i!=-1) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
742 if (is_code) {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
743 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
744 i = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
745 } else {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
746 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
747 i = i+MIN_TMP_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
748 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
749 regv_h(ll)=i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
750 regv_l(ll)=i+1;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
751 } else { error(-1); ll=LREG_OFFSET+2; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
752 return list3(LREGISTER,ll,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
753 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
754
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
755 int
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
756 get_input_register_var(int i,NMTBL *n,int is_code)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
757 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
758 if (is_code) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
759 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
760 i = REG_VAR_BASE-i;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
761 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
762 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
763 i = i+MIN_TMP_REG;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
764 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
765 return list3(REGISTER,i,(int)n);
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
766 }
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
767
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
768 /* double register case? */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
769
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
770 int
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
771 get_input_register_var_1(int i,NMTBL *n,int is_code)
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
772 {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
773 if (is_code) {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
774 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
775 i = REG_VAR_BASE-i;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
776 } else {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
777 if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
778 i = i+MIN_TMP_REG;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
779 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
780 return list3(REGISTER,i,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
781 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
782
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
783 int
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
784 free_register_count(int d)
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
785 {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
786 int i,count,fcount;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
787 fcount = count = 0;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
788 for(i=0;i<MAX_REGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
789 if (! regs[i]) count++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
790 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
791 for(i=0;i<MAX_FREGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
792 if (! regs[i+FREG_OFFSET]) fcount++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
793 }
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
794 printf("# free reg %d freg %d\n",count,fcount);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
795 return d?fcount:count;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
796 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
797
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
798 #if 0
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
799 static int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
800 register_full(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
801 {
917947ffeb7c power pc version
kono
parents:
diff changeset
802 int i;
917947ffeb7c power pc version
kono
parents:
diff changeset
803 for(i=0;i<MAX_REGISTER;i++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
804 if (! regs[i]) {
917947ffeb7c power pc version
kono
parents:
diff changeset
805 return 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
806 }
917947ffeb7c power pc version
kono
parents:
diff changeset
807 }
917947ffeb7c power pc version
kono
parents:
diff changeset
808 return 1;
917947ffeb7c power pc version
kono
parents:
diff changeset
809 }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
810 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
811
917947ffeb7c power pc version
kono
parents:
diff changeset
812 void
917947ffeb7c power pc version
kono
parents:
diff changeset
813 free_all_register(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
814 {
917947ffeb7c power pc version
kono
parents:
diff changeset
815 int i;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
816 // printf("# free_all register\n");
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
817 #if LONGLONG_CODE
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
818 for(i=0;i<REAL_MAX_LREGISTER;i++) {
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
819 regs[i+LREG_OFFSET]=0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
820 regv_l(i+LREG_OFFSET) = 0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
821 regv_h(i+LREG_OFFSET) = 0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
822 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
823 lreg = 0;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
824 // set_lreg(LREG_LREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
825 #endif
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
826 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
827 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
828 #if FLOAT_CODE
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
829 freg = get_dregister(1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
830 set_freg(FREG_FREGISTER,0);
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
831 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
832 ireg = creg = get_register();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
833 set_ireg(CREG_REGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
834 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
835 }
917947ffeb7c power pc version
kono
parents:
diff changeset
836
345
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
837 extern int
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
838 code_register_overlap(int s,int t)
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
839 {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
840 switch(car(s)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
841 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
842 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
843 case DREGISTER: case FREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
844 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
845 if(cadr(s)==cadr(t)) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
846 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
847 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
848 if(cadr(s)==regv_l(cadr(t))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
849 if(cadr(s)==regv_h(cadr(t))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
850 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
851 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
852 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
853 case DREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
854 case FREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
855 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
856 case REGISTER: case LREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
857 case DREGISTER: case FREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
858 if(cadr(s)==cadr(t)) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
859 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
860 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
861 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
862 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
863 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
864 case DREGISTER: case FREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
865 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
866 if(cadr(t)==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
867 if(cadr(t)==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
868 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
869 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
870 if(regv_l(cadr(t))==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
871 if(regv_l(cadr(t))==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
872 if(regv_h(cadr(t))==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
873 if(regv_h(cadr(t))==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
874 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
875 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
876 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
877 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
878 return 0;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
879 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
880
89
917947ffeb7c power pc version
kono
parents:
diff changeset
881 void
917947ffeb7c power pc version
kono
parents:
diff changeset
882 register_usage(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
883 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
884 #if 1
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
885 int i,j;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
886 #endif
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
887 #define USAGE_MAX 4
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
888 if (chk) return;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
889 if (!lsrc) return;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
890 printf("# %d: %s:",lineno,s);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
891 if (ireg) printf(" creg=%s",register_name(ireg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
892 if (freg) printf(" freg=%s",fregister_name(freg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
893 if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg),
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
894 lregister_name_low(lreg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
895 #if 1
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
896 for(j=0,i=0;i<MAX_REGISTER;i++) if (regs[i]) j++;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
897 if (j>USAGE_MAX) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
898 printf("\n# regs:");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
899 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
900 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
901 if (reg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
902 printf(" stack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
903 for(i=reg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
904 if(reg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
905 printf(" %s",register_name(reg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
906 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
907 printf(",%d",reg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
908 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
909 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
910 for(j=0,i=0;i<MAX_FREGISTER;i++) if (regs[i+FREG_OFFSET]) j++;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
911 if (j>USAGE_MAX) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
912 printf("\n# freg:");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
913 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
914 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
915 if (freg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
916 printf(" fstack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
917 for(i=freg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
918 if(freg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
919 printf(" %s",fregister_name(freg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
920 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
921 printf(",%d",freg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
922 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
923 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
924
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
925 for(j=0,i=0;i<REAL_MAX_LREGISTER;i++) if (regs[i+LREG_OFFSET]) j++;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
926 if (j>USAGE_MAX) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
927 printf("\n# lreg:");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
928 for(i=0;i<REAL_MAX_LREGISTER;i++) { printf("%d",regs[i+LREG_OFFSET]); }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
929 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
930 if (lreg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
931 printf(" lstack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
932 for(i=lreg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
933 if(lreg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
934 printf(" %s",lregister_name_high(lreg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
935 printf(",%s",lregister_name_low(lreg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
936 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
937 printf(",%d",lreg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
938 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
939 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
940 #endif
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
941 printf("\n");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
942 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
943
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
944 #if 0
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
945 void
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
946 register_usage(char *s)
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
947 {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
948 #if 1
89
917947ffeb7c power pc version
kono
parents:
diff changeset
949 int i;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
950 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
951 if (chk) return;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
952 if (!lsrc) return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
953 printf("# %d: %s:",lineno,s);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
954 if (ireg) printf(" creg=%s",register_name(ireg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
955 if (freg) printf(" freg=%s",fregister_name(freg));
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
956 if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg),
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
957 lregister_name_low(lreg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
958 #if 1
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
959 printf("\n# regs:");
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
960 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
961 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
962 for(i=reg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
963 if(reg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
964 printf(" %s",register_name(reg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
965 }
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
966 printf("\n# freg:");
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
967 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
968 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
969 for(i=freg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
970 if(freg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
971 printf(" %s",fregister_name(freg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
972 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
973 printf("\n# lreg:");
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
974 for(i=0;i<REAL_MAX_LREGISTER;i++) { printf("%d",regs[i+LREG_OFFSET]); }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
975 printf(" stack ");
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
976 for(i=lreg_sp;i>0;i--) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
977 if(lreg_stack[i-1]>=0)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
978 printf(" %s",lregister_name_high(lreg_stack[i]));
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
979 printf(",%s",lregister_name_low(lreg_stack[i]));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
980 }
917947ffeb7c power pc version
kono
parents:
diff changeset
981 #endif
917947ffeb7c power pc version
kono
parents:
diff changeset
982 printf("\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
983 }
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
984 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
985
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
986 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
987
89
917947ffeb7c power pc version
kono
parents:
diff changeset
988 gexpr_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
989 {
917947ffeb7c power pc version
kono
parents:
diff changeset
990 while(reg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
991 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
992 free_register(reg_stack[--reg_sp]);
917947ffeb7c power pc version
kono
parents:
diff changeset
993 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
994 while(freg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
995 error(-1);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
996 free_register(freg_stack[--freg_sp]);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
997 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
998 while(lreg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
999 error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1000 free_register(lreg_stack[--lreg_sp]);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1001 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1002 use_int0();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1003 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
1004 gexpr_code_init();
917947ffeb7c power pc version
kono
parents:
diff changeset
1005 register_usage("gexpr_init");
917947ffeb7c power pc version
kono
parents:
diff changeset
1006 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1007
917947ffeb7c power pc version
kono
parents:
diff changeset
1008
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1009 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1010
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1011 emit_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
1012 {
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
1013 /* called before each declaration */
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
1014
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1015 free_all_register();
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1016 max_reg_var=-1; max_freg_var=-1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1017 reg_sp = 0;
123
5f180dc8d84e intel fix.
kono
parents: 122
diff changeset
1018 freg_sp = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1019 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
1020 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1021
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1022
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1023 int
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1024 get_register_var(NMTBL *n)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1025 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1026 int i;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1027 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
1028 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1029 /* ���Υ쥸������Ȥ����Ȥ������ */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1030 regs[REG_VAR_BASE-i]=USING_REG;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1031 if (i>max_reg_var) max_reg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1032 /* ���ξ���ɽ���ֹ���֤� */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1033 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1034 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1035 }
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1036 return list2(LVAR,new_lvar(SIZE_OF_INT));
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1037 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1038
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1039 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1040 get_dregister_var(NMTBL *n,int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1041 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1042 int i;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
1043 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1044 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1045 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*���Υ쥸������Ȥ����Ȥ������*/
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1046 if (i>max_freg_var) max_freg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1047 /* ���ξ���ɽ���ֹ���֤� */
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1048 return list3(DREGISTER,
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1049 FREG_VAR_BASE-i+FREG_OFFSET,(int)n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1050 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1051 }
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1052 return list2(LVAR,new_lvar(SIZE_OF_DOUBLE));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1053 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1054
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1055 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1056
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1057 emit_push()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1058 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1059 int new_reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1060 if (!is_int_reg(creg)) error(-1);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1061 if (reg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1062 new_reg = get_register(); /* ���Ф˼��� */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1063 reg_stack[reg_sp++] = creg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1064 ireg = creg = new_reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1065 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1066
917947ffeb7c power pc version
kono
parents:
diff changeset
1067 int
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1068 emit_pop(int type)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1069 {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1070 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1071 xreg=pop_register();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1072 if (xreg<= -REG_LVAR_OFFSET) {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1073 reg = get_register();
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1074 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
1075 free_lvar(REG_LVAR_OFFSET+xreg);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1076 xreg = reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1077 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1078 return xreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1079 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1080
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1081 static int code_base;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1082
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1083 extern void
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1084 code_ptr_cache_def(int r,NMTBL *nptr)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1085 {
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1086 char *rrn = register_name(r);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1087 if (nptr->sc==STATIC) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1088 printf("\taddis %s,r31,ha16(_%s-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1089 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1090 printf("\tla %s,lo16(_%s-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1091 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1092 } else {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1093 printf("\taddis %s,r31,ha16(L_%s$non_lazy_ptr-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1094 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1095 printf("\tlwz %s,lo16(L_%s$non_lazy_ptr-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1096 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1097 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1098 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1099
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1100 static char *cload(int sz) { return sz==1?"lbz":sz==SIZE_OF_SHORT?"lhz":"lwz"; }
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1101 static char *cstore(int sz) { return sz==1?"stb":sz==SIZE_OF_SHORT?"sth":"stw"; }
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1102
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1103 static void
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1104 cext(int sign,int sz,int reg)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1105 {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1106 char *crn = register_name(reg);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1107 if (sign) {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1108 if (sz==1)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1109 printf("\textsb %s,%s\n",crn,crn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1110 else if (sz==SIZE_OF_SHORT)
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1111 printf("\textsh %s,%s\n",crn,crn);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1112 } else {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1113 if (sz==1)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1114 printf("\trlwinm %s,%s,0,0xff\n",crn,crn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1115 else if (sz==SIZE_OF_SHORT)
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1116 printf("\trlwinm %s,%s,0,0xffff\n",crn,crn);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1117 }
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1118 }
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1119
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1120
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1121 void
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1122 code_label(int labelno)
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1123 {
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1124 clear_ptr_cache();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1125 printf("L_%d:\n",labelno);
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1126 }
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1127
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1128 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1129 code_add(int reg,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1130 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1131 char *crn = register_name(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1132 char *rrn = register_name(r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1133 if (offset==0) {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1134 if(r!=reg)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1135 printf("\tmr %s,%s\n",crn,rrn);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
1136 } else if (LARGE_OFFSET(offset)) {
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1137 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1138 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1139 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1140 printf("\taddi %s,%s,%d\n",crn,rrn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1141 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1142
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1143 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1144 code_ld(char *ld,int reg,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1145 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1146 char *crn = register_name(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1147 char *rrn = register_name(r);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
1148 if (LARGE_OFFSET(offset)) {
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1149 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1150 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,crn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1151 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1152 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1153 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1154
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1155 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1156 code_ldf(char *ld,char *crn,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1157 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1158 char *rrn = register_name(r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1159 int reg;
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1160 char *lrn;
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1161 if (offset<-32768||32767<offset) {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1162 lrn = register_name(reg = get_register());
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1163 printf("\tla %s,ha16(%d)(%s)\n",lrn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1164 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,lrn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1165 free_register(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1166 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1167 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1168 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1169
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1170 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1171 code_gvar(int e1,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1172 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1173 code_add(reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1174 return;
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 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1178 code_rgvar(int e1,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1179 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1180 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1181 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1182
917947ffeb7c power pc version
kono
parents:
diff changeset
1183 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1184 code_crgvar(int e1,int reg,int sign,int sz){
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1185 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1186 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1187 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1188 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1189
165
kono
parents: 164
diff changeset
1190
kono
parents: 164
diff changeset
1191
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1192 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1193 code_register(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1194 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1195 if (reg!=e2)
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1196 printf("\tmr %s,%s\n",register_name(reg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1197 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1198
353
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1199 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1200 code_i2c(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1201 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1202 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1203 cext(1,1,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1204 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1205
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1206 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1207 code_i2s(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1208 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1209 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1210 cext(1,SIZE_OF_SHORT,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1211 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1212
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1213 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1214 code_u2uc(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1215 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1216 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1217 cext(0,1,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1218 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1219
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1220 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1221 code_u2us(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1222 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1223 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1224 cext(0,SIZE_OF_SHORT,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1225 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1226
917947ffeb7c power pc version
kono
parents:
diff changeset
1227 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1228 code_rlvar(int e2,int reg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1229 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1230 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1231 printf("\tlwz %s,",register_name(reg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1232 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1233 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1234
917947ffeb7c power pc version
kono
parents:
diff changeset
1235 void
165
kono
parents: 164
diff changeset
1236 code_crlvar(int e2,int reg,int sign,int sz) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1237 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1238 lvar_intro(e2);
165
kono
parents: 164
diff changeset
1239 printf("\t%s %s,",cload(sz),register_name(reg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1240 lvar(e2);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1241 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1242 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1243
917947ffeb7c power pc version
kono
parents:
diff changeset
1244 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1245 code_fname(NMTBL *n,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1246 int r;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1247 use_int(reg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1248 r = get_ptr_cache(n);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1249 if(r!=reg)
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1250 printf("\tmr %s,%s\n",register_name(reg),register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1251 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1252 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1253
363
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1254 void
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1255 code_label_value(int label,int reg) {
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1256 char *crn;
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1257 use_int(reg);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1258 crn = register_name(reg);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1259 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,label,code_base);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1260 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,label,code_base,crn);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1261 return;
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1262 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1263
917947ffeb7c power pc version
kono
parents:
diff changeset
1264 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1265 code_const(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1266 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1267 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1268 crn = register_name(reg);
371
238c3704ee3d ARM first try
kono
parents: 368
diff changeset
1269 // printf("# 0x%08x\n",e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1270 if (-32768<e2&&e2<32768)
917947ffeb7c power pc version
kono
parents:
diff changeset
1271 printf("\tli %s,%d\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1272 else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1273 printf("\tlis %s,ha16(%d)\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1274 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1275 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1276 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1277
917947ffeb7c power pc version
kono
parents:
diff changeset
1278
917947ffeb7c power pc version
kono
parents:
diff changeset
1279 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1280 code_neg(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1281 use_int(creg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1282 printf("\tneg %s,%s\n", register_name(creg), register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1283 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1284
917947ffeb7c power pc version
kono
parents:
diff changeset
1285
917947ffeb7c power pc version
kono
parents:
diff changeset
1286 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1287 code_not(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1288 use_int(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1289 printf("\tnor %s,%s,%s\n",
917947ffeb7c power pc version
kono
parents:
diff changeset
1290 register_name(creg), register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1291 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1292
917947ffeb7c power pc version
kono
parents:
diff changeset
1293
917947ffeb7c power pc version
kono
parents:
diff changeset
1294 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1295 code_lnot(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1296 use_int(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1297 printf("\tsubfic r0,%s,0\n", register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1298 printf("\tadde %s,r0,%s\n", register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1299 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1300
917947ffeb7c power pc version
kono
parents:
diff changeset
1301 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1302 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1303 char *xrn,*drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1304 if (car(e2)==REGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1305 use_int(reg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1306 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1307 register_name(cadr(e2)),register_name(cadr(e2)), dir);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1308 if (cadr(e2)!=reg)
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1309 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1310 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1311 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1312 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1313 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1314 xrn = register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1315 if (reg==USE_CREG) {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1316 reg=get_register(); if (!reg) error(-1);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1317 drn = register_name(reg);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1318 set_ireg(reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1319 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1320 drn = register_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1321 }
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1322 printf("\t%s %s,0(%s)\n",cload(sz),drn,xrn);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1323 if (use) cext(sign,sz,reg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1324 printf("\taddi %s,%s,%d\n",drn,drn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1325 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1326 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1327
917947ffeb7c power pc version
kono
parents:
diff changeset
1328
917947ffeb7c power pc version
kono
parents:
diff changeset
1329 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1330 code_postinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1331 char *xrn,*crn,*nrn;
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1332 int nreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1333 if (car(e2)==REGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1334 use_int(reg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1335 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1336 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1337 register_name(cadr(e2)),register_name(cadr(e2)),dir);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1338 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1339 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1340 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1341 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1342 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1343 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
1344 nrn = register_name(nreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1345 if (reg==USE_CREG) {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1346 reg=get_register(); if (!reg) error(-1);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1347 xrn = register_name(reg);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1348 set_ireg(reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1349 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1350 xrn = register_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1351 }
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1352 printf("\t%s %s,0(%s)\n",cload(sz),xrn,crn);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1353 if (use) cext(sign,sz,reg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1354 printf("\taddi %s,%s,%d\n",nrn,xrn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1355 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1356 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1357 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1358
917947ffeb7c power pc version
kono
parents:
diff changeset
1359
917947ffeb7c power pc version
kono
parents:
diff changeset
1360 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1361 code_return(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1362 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1363 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1364 crn = register_name(creg);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1365 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,retcont,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1366 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,retcont,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1367 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1368
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1369 #define R1SAVE 1
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1370
917947ffeb7c power pc version
kono
parents:
diff changeset
1371 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1372 code_environment(int creg) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1373 /* save frame pointer */
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1374 use_int(creg);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1375 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1376 printf("\tlwz %s,0(r1)\n",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1377 #else
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1378 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1379 printf("\tla %s,",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1380 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1381 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1382 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1383
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1384 static int rexpr_bool(int e1,int reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1385
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1386 #if FLOAT_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1387 static int drexpr_bool(int e1,int reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1388 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1389
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1390 #if LONGLONG_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1391 static int lrexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1392 {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1393 return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1394 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1395 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1396
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1397
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1398
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1399 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1400 code_bool(int e1,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1401 char *xrn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1402 int e2,e3;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1403
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1404 if (rexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1405 #if FLOAT_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1406 else if (drexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1407 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1408 #if LONGLONG_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1409 else if (lrexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1410 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1411
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1412 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1413 if (use) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1414 use_int(reg);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1415 xrn = register_name(reg);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1416 printf("\tli %s,0\n",xrn);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1417 jmp(e3=fwdlabel());
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1418 fwddef(e2);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1419 printf("\tli %s,1\n",xrn);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1420 fwddef(e3);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1421 } else {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1422 fwddef(e2);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1423 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1424 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1425
917947ffeb7c power pc version
kono
parents:
diff changeset
1426 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1427 code_gt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1428 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1429 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1430
917947ffeb7c power pc version
kono
parents:
diff changeset
1431 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1432 code_ugt(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1433 return (cond?"gt":"le");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1434 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1435
917947ffeb7c power pc version
kono
parents:
diff changeset
1436 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1437 code_ge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1438 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1439 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1440
917947ffeb7c power pc version
kono
parents:
diff changeset
1441 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1442 code_uge(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1443 return (cond?"ge":"lt");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1444 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1445
917947ffeb7c power pc version
kono
parents:
diff changeset
1446 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
1447 code_eq(int cond) {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
1448 return (cond?"eq":"ne");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1449 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1450
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1451 static int cmpflag = 0;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1452
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1453 static void
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1454 inc_cmpflag()
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1455 {
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1456 cmpflag = (cmpflag+1)%8;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1457 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1458
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1459 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1460 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1461 int r;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1462 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1463 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1464 cext(0,sz,r);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1465 inc_cmpflag();
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1466 printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(reg));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1467 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1468 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1469
917947ffeb7c power pc version
kono
parents:
diff changeset
1470
917947ffeb7c power pc version
kono
parents:
diff changeset
1471 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1472 code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1473 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1474 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1475 crn = register_name(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1476 lvar_intro(e2);
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1477 printf("\t%s %s,",cload(sz),crn);
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1478 lvar(e2);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1479 cext(0,sz,reg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1480 code_cmp_register(reg,label,cond);
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1481 }
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1482
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1483
917947ffeb7c power pc version
kono
parents:
diff changeset
1484 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1485 code_cmp_rgvar(int e1,int reg,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1486 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1487 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1488 code_cmp_register(reg,label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1489 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1490
917947ffeb7c power pc version
kono
parents:
diff changeset
1491
917947ffeb7c power pc version
kono
parents:
diff changeset
1492 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1493 code_cmp_rlvar(int e2,int reg,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1494 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1495 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1496 crn = register_name(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1497 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1498 printf("\tlwz %s,",crn);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1499 lvar(e2);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1500 code_cmp_register(reg,label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1501 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1502
917947ffeb7c power pc version
kono
parents:
diff changeset
1503
917947ffeb7c power pc version
kono
parents:
diff changeset
1504 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1505 code_cmp_register(int e2,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1506 use_int(e2);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1507 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1508 printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(e2));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1509 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1510 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1511
917947ffeb7c power pc version
kono
parents:
diff changeset
1512
917947ffeb7c power pc version
kono
parents:
diff changeset
1513 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1514 code_string(int e1,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1515 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1516 int lb;
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1517 char *crn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1518
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1519 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1520 crn = register_name(creg);
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1521 lb = emit_string_label();
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1522 ascii((char *)cadr(e1));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1523 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1524 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1525 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1526 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
1527 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1528 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1529 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,lb,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1530 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1531
917947ffeb7c power pc version
kono
parents:
diff changeset
1532 #define MAX_COPY_LEN 20
917947ffeb7c power pc version
kono
parents:
diff changeset
1533
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1534 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1535
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1536 emit_copy(int from,int to,int length,int offset,int value,int det)
917947ffeb7c power pc version
kono
parents:
diff changeset
1537 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1538 char *frn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1539 char *trn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1540 char *drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1541 int fix = 0;
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1542 char *memmove = "memmove";
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1543 int dreg = get_register(); if (!dreg) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1544
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1545 drn = register_name(dreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1546 use_int(from);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1547 use_int(to);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1548 frn = register_name(from);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1549 trn = register_name(to);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1550
917947ffeb7c power pc version
kono
parents:
diff changeset
1551 /* length <0 means upward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1552 switch (length) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1553 case 0: break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1554 case 1: case -1:
917947ffeb7c power pc version
kono
parents:
diff changeset
1555 printf("\tlbz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1556 printf("\tstb %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1557 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1558 case 2: case -2:
917947ffeb7c power pc version
kono
parents:
diff changeset
1559 printf("\tlhz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1560 printf("\tsth %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1561 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1562 case 4: case -4:
917947ffeb7c power pc version
kono
parents:
diff changeset
1563 printf("\tlwz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1564 printf("\tstw %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1565 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1566 default:
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1567 if (length <0) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1568 if (length > -MAX_COPY_LEN) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1569 for(;length<=-4;length+=4,offset-=4)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1570 emit_copy(from,to,-4,offset-4,0,det);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1571 for(;length<=-2;length+=2,offset-=2)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1572 emit_copy(from,to,-2,offset-2,0,det);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1573 if(length<0)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1574 emit_copy(from,to,length,offset-1,0,det);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1575 break;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1576 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1577 } else if (length <=MAX_COPY_LEN) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1578 for(;length>=4;length-=4,offset+=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1579 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1580 for(;length>=2;length-=2,offset+=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1581 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1582 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1583 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1584 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1585 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1586 clear_ptr_cache();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1587 code_save_stacks();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1588 printf("\tli r5,%d\n",length);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1589 printf("\tmr r4,%s\n",frn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1590 printf("\tmr r3,%s\n",trn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1591 /* overrap must be allowed */
e537da31dce3 struct push
kono
parents: 123
diff changeset
1592 printf("\tbl L_%s$stub\n",memmove);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1593 extern_define(memmove,0,FUNCTION,1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1594 fix=0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1595 set_ireg(RET_REGISTER,0);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1596 if (creg!=to) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1597 free_register(to); to = creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1598 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1599 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1600 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1601 if (value) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1602 /* creg must point top of the destination data */
917947ffeb7c power pc version
kono
parents:
diff changeset
1603 /* this code is necessary for the value of assignment or function call */
917947ffeb7c power pc version
kono
parents:
diff changeset
1604 /* otherwise we don't need this */
917947ffeb7c power pc version
kono
parents:
diff changeset
1605 if (fix) printf("\taddi %s,%s,%d\n",trn,trn,fix);
917947ffeb7c power pc version
kono
parents:
diff changeset
1606 if(creg!=to) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1607 free_register(creg); creg=to; ireg=to;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1608 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1609 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1610 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1611 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1612
917947ffeb7c power pc version
kono
parents:
diff changeset
1613 int
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1614 struct_push(int e4,int t,int arg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1615 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1616 int length,count;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1617 int dreg,sreg; char *drn,*crn,*srn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1618 g_expr(e4);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1619 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1620 length=size(t);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1621 if(length%SIZE_OF_INT) {
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1622 length += SIZE_OF_INT - (length%SIZE_OF_INT);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1623 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1624 dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1625 drn = register_name(dreg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1626 crn = register_name(creg);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1627 if (length<MAX_COPY_LEN) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1628 sreg = get_register(); if (!sreg) error(-1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1629 srn = register_name(sreg);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1630 code_lvar(cadr(arg),dreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1631 for(count=0;count<length;count+=SIZE_OF_INT) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1632 printf("\tlwz %s,%d(%s)\n",srn,count,crn);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1633 printf("\tstwu %s,%d(%s)\n",srn,count,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1634 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1635 free_register(sreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1636 free_register(dreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1637 return length/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1638 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1639 code_lvar(cadr(arg),dreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1640 /* downward direction copy */
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1641 emit_copy(creg,dreg,length,0,0,1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1642 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1643 free_register(dreg);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1644 return length/SIZE_OF_INT;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1645 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1646
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1647 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1648 set_ireg(int reg,int mode)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1649 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1650 if (!is_int_reg(reg)) error(-1);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1651 if (reg!=creg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1652 clear_ptr_cache_reg(reg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1653 if (ireg && reg!=ireg ) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1654 free_register(ireg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1655 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1656 printf("\tmr %s,%s\n",register_name(reg),register_name(ireg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1657 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1658 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1659 free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1660 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1661 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1662 creg = ireg = reg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1663 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1664
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1665 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1666 set_freg(int reg,int mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1667 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1668 if (!is_float_reg(reg)) error(-1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1669 if (reg!=creg) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1670 if (freg && reg!=freg) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1671 free_register(freg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1672 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1673 printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1674 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1675 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1676 // if (creg!=ireg) free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1677 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1678 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1679 creg = freg = reg;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1680 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1681
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1682 void
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1683 set_lreg(int reg,int mode)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1684 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1685 if (reg==RET_LREGISTER) {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1686 regv_l(reg) = RET_LREGISTER_L;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1687 regv_h(reg) = RET_LREGISTER_H;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1688 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1689 if (!is_longlong_reg(reg)) error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1690 if (reg!=creg) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1691 if (lreg && reg!=lreg) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1692 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1693 printf("\tmr %s,%s\n",
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1694 lregister_name_low(reg),lregister_name_low(lreg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1695 printf("\tmr %s,%s\n",
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1696 lregister_name_high(reg),lregister_name_high(lreg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1697 }
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
1698 free_register(lreg);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1699 }
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
1700 free_register(creg);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1701 regs[reg]=USING_REG;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1702 clear_ptr_cache_reg(regv_l(reg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1703 regs[regv_l(reg)]=USING_REG;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1704 clear_ptr_cache_reg(regv_h(reg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1705 regs[regv_h(reg)]=USING_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1706 }
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
1707 creg = lreg = reg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1708 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1709
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1710 void
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1711 set_lreg_operand(int reg,int mode)
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1712 {
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
1713 // save_stack,clear_ptr_cache is assumed
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1714 if (!is_longlong_reg(reg)) { error(-1); return; }
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1715 if (mode) {
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1716 if (regv_l(reg)!=3)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1717 printf("\tmr r3,%s\n", lregister_name_high(reg));
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1718 if (regv_l(reg)!=4)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1719 printf("\tmr r4,%s\n", lregister_name_low(reg));
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1720 }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1721 }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1722
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1723 void
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1724 set_lreg_operand1(int reg,int mode)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1725 {
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
1726 // save_stack,clear_ptr_cache is assumed
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1727 if (!is_longlong_reg(reg)) { error(-1); return; }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1728 if (mode) {
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1729 if (regv_l(reg)!=5)
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1730 printf("\tmr r5,%s\n", lregister_name_high(reg));
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1731 if (regv_l(reg)!=6)
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1732 printf("\tmr r6,%s\n", lregister_name_low(reg));
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1733 }
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1734 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1735
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1736 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1737 use_reg(int arg)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1738 {
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
1739 // printf("# use reg %d\n",arg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1740 if (arg<0||arg> REAL_MAX_REGISTER+REAL_MAX_FREGISTER+ REAL_MAX_LREGISTER)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1741 error(-1);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1742 clear_ptr_cache_reg(arg);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1743 regs[arg]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1744 if (is_longlong_reg(arg)) {
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1745 clear_ptr_cache_reg(regv_l(arg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1746 regs[regv_l(arg)]=USING_REG;
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1747 clear_ptr_cache_reg(regv_h(arg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1748 regs[regv_h(arg)]=USING_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1749 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1750 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1751
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1752 void
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1753 code_save_input_registers(int dots)
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1754 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1755 int args;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1756 NMTBL *n;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1757 int reg;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1758 int tag;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1759 int lvar;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1760 int t;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1761 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1762 int reg_offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1763 int offset = 0;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1764 int reg_var = 0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1765
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1766 for(args = fnptr->dsp;args;args = cadr(args)) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1767 n = (NMTBL *)caddr(args);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1768 tag = n->sc;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1769 reg = n->dsp;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1770 if (!n||n==&null_nptr) error(REG_ERR);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1771 if (tag==REGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1772 /* regs[reg]==INPUT_REG case should be considered */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1773 n->dsp = offset;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1774 offset+=SIZE_OF_INT;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1775 t = INT;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1776 reg += reg_offset; /* for duplicated floating point argument */
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1777 reg_var++;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1778 } else if (tag==DREGISTER) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1779 /* regs[reg]==INPUT_REG case should be considered */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1780 n->dsp = offset;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1781 t = n->ty;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1782 if(t==FLOAT) { offset+=SIZE_OF_FLOAT; reg_offset+=1; }
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1783 else if(t==DOUBLE) { offset+=SIZE_OF_DOUBLE; reg_offset+=2; }
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1784 else error(-1);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1785 reg_var += 2;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1786 } else if (tag==LREGISTER) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1787 /* regs[reg]==INPUT_REG case should be considered */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1788 n->dsp = offset;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1789 t = n->ty;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1790 offset+=SIZE_OF_LONGLONG; reg_offset+=2;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1791 reg_var += 2;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1792 } else {
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1793 offset += size(n->ty);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1794 continue;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1795 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1796 n->sc = LVAR;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1797 lvar = list2(LVAR,n->dsp);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1798 g_expr_u(assign_expr0(
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1799 list2(LVAR,n->dsp),list3(tag,reg,(int)n),n->ty,t));
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1800 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1801 free_register(reg);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1802 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1803 }
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1804 if (dots) {
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1805 while ((reg = get_input_register_var(reg_var,0,0))) {
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1806 g_expr_u(assign_expr0(
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1807 list2(LVAR,offset),reg,INT,INT));
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1808 offset+=SIZE_OF_INT;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1809 reg_var++;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1810 }
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1811 }
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1812 my_func_args = offset;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1813 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1814
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1815 static int
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1816 not_simple_p(int e3)
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1817 {
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1818 return e3==FUNCTION||e3==CONV||e3==RSTRUCT||e3==STASS||
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1819 e3==LLSHIFT||e3==LULSHIFT||e3==LRSHIFT||e3==LURSHIFT||
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
1820 e3==LDIV||e3==LUDIV||e3==LMOD||e3==LUMOD||e3==LASSOP||e3==ALLOCA;
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1821 }
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1822
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1823 static int
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1824 simple_arg(int e3)
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1825 {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1826 return !contains_p(e3,not_simple_p);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1827 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1828
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1829 int
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1830 caller_arg_offset_v(int arg)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1831 {
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1832 return ARG_LVAR_OFFSET+arg*SIZE_OF_INT;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1833 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1834
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1835 void
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1836 use_input_reg(int reg,int mode)
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1837 {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1838 if (is_int_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1839 if (ireg&&reg == ireg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1840 if (creg==ireg) creg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1841 ireg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1842 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1843 if (lreg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1844 if (regv_l(lreg)==reg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1845 regs[lreg]=0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1846 if (regv_h(lreg)>reg&&regs[regv_h(lreg)]==USING_REG) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1847 free_register(regv_h(lreg));
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1848 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1849 if (creg==lreg) creg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1850 lreg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1851 } else if (regv_h(lreg)==reg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1852 regs[lreg]=0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1853 if (regv_h(lreg)>reg&&regs[regv_l(lreg)]==USING_REG) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1854 free_register(regv_l(lreg));
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1855 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1856 if (creg==lreg) creg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1857 lreg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1858 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1859 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1860 } else if (is_longlong_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1861 use_input_reg(regv_h(reg),0);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1862 use_input_reg(regv_l(reg),0);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1863 } else if (is_float_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1864 if (freg&&reg == freg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1865 if (creg==freg) creg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1866 freg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1867 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1868 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1869 if (mode) use_reg(reg);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1870 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1871
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
1872 static int
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1873 compute_complex_arg(int e3,int reg_arg_list,int arg) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1874 int t=caddr(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1875 int e4 = car(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1876 reg_arg_list = list2(arg,reg_arg_list);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1877 g_expr_u(assign_expr0(arg,e4,t,t));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1878 if (car(arg)==REGISTER||car(arg)==DREGISTER||
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1879 car(arg)==FREGISTER||car(arg)==LREGISTER)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1880 use_input_reg(cadr(arg),1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1881 car(e3) = arg;
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
1882 return reg_arg_list;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1883 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1884
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1885 static void
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1886 increment_function_arg(int e3,int *pnargs,int *preg_arg,int *pfreg_arg) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1887 int nargs=0,reg_arg=0,freg_arg=0;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1888 int t=caddr(e3);
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1889 if (t>=0&&(car(t)==BIT_FIELD)) {
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1890 t = cadr(t);
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1891 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1892 if(scalar(t)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1893 nargs ++ ; reg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1894 } else if (t==LONGLONG||t==ULONGLONG) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1895 nargs ++ ; reg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1896 nargs ++ ; reg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1897 } else if (t==DOUBLE||t==FLOAT) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1898 if (*preg_arg<MAX_INPUT_REGISTER_VAR) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1899 reg_arg += 2;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1900 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1901 freg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1902 nargs += size(t)/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1903 } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1904 nargs += round4(size(t))/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1905 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1906 error(TYERR);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1907 nargs ++ ;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1908 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1909 *pnargs += nargs;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1910 *preg_arg += reg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1911 *pfreg_arg += freg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1912 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1913
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1914 #define AS_SAVE 1
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1915 #define AS_ARG 0
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1916
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1917 static int
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1918 get_input_arg(int t,int mode,int nargs,int reg_arg,int freg_arg)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1919 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1920 if (t>=0&&(car(t)==BIT_FIELD)) {
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1921 t = cadr(t);
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1922 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1923 if(scalar(t)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1924 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1925 return get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1926 } else if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1927 return list2(LVAR,caller_arg_offset_v(nargs));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1928 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1929 return get_input_register_var(reg_arg,0,0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1930 } else if (t==LONGLONG||t==ULONGLONG) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1931 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1932 return get_lregister_var(0);
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
1933 } else if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1934 return list2(LVAR,caller_arg_offset_v(nargs));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1935 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1936 return get_input_lregister_var(reg_arg,0,0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1937 } else if (t==FLOAT) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1938 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1939 return get_dregister_var(0,0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1940 } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1941 return list2(LVAR,caller_arg_offset_v(nargs));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1942 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1943 return get_input_dregister_var(freg_arg,0,0,0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1944 } else if (t==DOUBLE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1945 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1946 return get_dregister_var(0,1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1947 } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1948 return list2(LVAR,caller_arg_offset_v(nargs));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1949 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1950 return get_input_dregister_var(freg_arg,0,0,1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1951 } else if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1952 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1953 return get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1954 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1955 return list2(LVAR,caller_arg_offset_v(nargs));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1956 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1957 error(-1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1958 return get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1959 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1960 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1961
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1962 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1963 function(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
1964 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1965 int e2,e3,e4,e5,nargs,t,r0,r1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1966 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
1967 int dots;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1968 int reg_arg_list=0,ret_type,special_lvar;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
1969 NMTBL *fn = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1970 int jmp = 0;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1971 char *jrn;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1972 int complex_;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1973 int pnargs,preg_arg,pfreg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1974 int stargs;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1975
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1976 special_lvar = -1;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1977 #if 0
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1978 ret_type = cadr(cadddr(e1));
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1979 if (ret_type==CHAR) ret_type=INT;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1980
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1981 /* check argments type is DOTS? */
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1982 t = caddr(cadddr(e1));
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1983 if (t==0 || t==DOTS) dots = 1;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1984 else {
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1985 dots = 0;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1986 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
1987 if (car(t)==DOTS) dots = 1;
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1988 }
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
1989 }
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1990 #else
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1991 ret_type = function_type(cadddr(e1),&dots);
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
1992 if (caddr(cadddr(e1))==0) dots=1;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1993 #endif
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1994
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
1995 arg_assign = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1996 e2 = cadr(e1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1997 if (car(e2) == FNAME) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1998 fn=(NMTBL *)cadr(e2);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1999 } else {
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2000 #if 0
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2001 jmp = get_register_var(0);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2002 if (car(jmp)!=REGISTER) error(-1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2003 reg_arg_list = list2(jmp,reg_arg_list);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2004 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2005 if (!is_int_reg(creg)) error(-1);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2006 code_register(creg,cadr(jmp));
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2007 /* g_expr(assign_expr0(jmp,e2,INT,INT)); functions are lvalue */
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2008 #else
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2009 if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2010 jmp = get_register_var(0);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2011 if (car(jmp)!=REGISTER) error(-1);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2012 reg_arg_list = list2(jmp,reg_arg_list);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2013 if (!simple_arg(e2)) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2014 g_expr_u(assign_expr0(jmp,e2,INT,INT));
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2015 } else
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2016 arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2017 #endif
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2018 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2019 /* first we execute complex argument to avoid interaction with
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2020 input variables */
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2021 stargs = 0;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2022 complex_ = 0;
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2023 nargs = reg_arg = freg_arg = 0;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2024 for (e3 = e1 = reverse0(caddr(e1)); e3; e3 = cadr(e3)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2025 t=caddr(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2026 if ((e5= !simple_arg(car(e3)))) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2027 if (complex_) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2028 arg = get_input_arg(caddr(complex_),AS_SAVE,
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2029 pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2030 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2031 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2032 pnargs=nargs;preg_arg=reg_arg;pfreg_arg=freg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2033 complex_ = e3;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2034 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2035 if (t>=0&&(car(t)==STRUCT||car(t)==UNION)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2036 // The struct should be pushed after complex arguments.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2037 if (e5) { // compute address only, complex_ is me now. Clear it.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2038 complex_ = 0;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2039 e4 = car(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2040 if (car(e4)!=RSTRUCT) error(-1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2041 if (!simple_arg(cadr(e4))) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2042 // Calculate complex struct address here.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2043 // If simple, leave it.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2044 arg = get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2045 g_expr_u(assign_expr0(arg,list2(ADDRESS,car(e3)),INT,INT));
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2046 car(e3)=arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2047 reg_arg_list = list2(arg,reg_arg_list);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2048 if (car(arg)==REGISTER) use_input_reg(cadr(arg),1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2049 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2050 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2051 stargs = list4(e3,stargs,nargs,reg_arg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2052 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2053 increment_function_arg(e3,&nargs,&reg_arg,&freg_arg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2054 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2055
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2056 /* now all input register vars are free */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2057 code_save_stacks();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2058 // set_lreg(LREG_LREGISTER,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2059 set_freg(FREG_FREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2060 set_ireg(CREG_REGISTER,0);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2061
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2062 // Struct arguments need emit_copy. it destructs 3 input registers.
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2063 // But it returns no value on a register. So calculate it here.
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2064 // We cannot do this in the previous loop, because the copied struct may be
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2065 // override by other complex arguments. But before this we have to check
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2066 // complex_.
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2067
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2068 if (stargs) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2069 if (complex_) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2070 arg = get_input_arg(caddr(complex_),AS_SAVE,
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2071 pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2072 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg);
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2073 }
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2074 for(stargs=reverse0(stargs);stargs;stargs = cadr(stargs)) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2075 e3 = car(stargs);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2076 e4 = car(e3);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2077 t = caddr(e3);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2078 arg = get_input_arg(t,AS_ARG,caddr(stargs),cadddr(stargs),0);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2079 struct_push(e4,t,arg);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2080 car(e3)=0; // done
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2081 }
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2082 } else {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2083 // last complex argument can use input register
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2084 if (complex_) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2085 arg = get_input_arg(caddr(complex_),AS_ARG,pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2086 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg);
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2087 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2088 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2089
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2090 nargs = reg_arg = freg_arg = 0;
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2091 // calc stack arguments first, it may requires extra registers,
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2092 // and we can still use input registers now.
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2093 for (e3 = e1; e3;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2094 increment_function_arg(e3,&nargs,&reg_arg,&freg_arg),
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2095 e3 = cadr(e3)) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2096 if (!(e4=car(e3))) continue;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2097 t=caddr(e3);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2098 arg = get_input_arg(t,AS_ARG,nargs,reg_arg,freg_arg);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2099 if (car(arg)!=LVAR) continue;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2100 g_expr_u(assign_expr0(arg,e4,t,t));
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2101 if (t==LONGLONG||t==ULONGLONG) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2102 if (reg_arg+1==MAX_INPUT_REGISTER_VAR) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2103 // half register, half memory case
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2104 arg_assign = list2(
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2105 assign_expr0(r0=get_input_register_var(reg_arg,0,0),
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2106 arg,INT,INT),
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2107 arg_assign);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2108 use_input_reg(cadr(r0),1);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2109 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2110 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2111 car(e3)=0; // done
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2112 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2113 nargs = reg_arg = freg_arg = 0;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2114 for (e3 = e1; e3;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2115 increment_function_arg(e3,&nargs,&reg_arg,&freg_arg),
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2116 e3 = cadr(e3)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2117 if (!(e4=car(e3))) continue;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2118 t=caddr(e3);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2119 arg = get_input_arg(t,AS_ARG,nargs,reg_arg,freg_arg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2120 if(scalar(t)) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2121 reg_arg_list = list2(arg,reg_arg_list);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2122 /* protect from input register free */
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2123 if (car(arg)==REGISTER)
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2124 use_input_reg(cadr(arg),1);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2125 g_expr_u(assign_expr0(arg,e4,t,t));
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
2126 } else if (t==LONGLONG||t==ULONGLONG) {
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2127 if (reg_arg+1==MAX_INPUT_REGISTER_VAR) {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2128 // half register, half memory case
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2129 // put whole long long anyway
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2130 arg_assign = list2(
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
2131 assign_expr0(r0=get_input_register_var(reg_arg,0,0),
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2132 arg,INT,INT),
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2133 arg_assign);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2134 use_input_reg(cadr(r0),1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2135 } else {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2136 if (car(arg)==LREGISTER)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2137 use_input_reg(cadr(arg),1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2138 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2139 reg_arg_list = list2(arg,reg_arg_list);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2140 g_expr_u(assign_expr0(arg,e4,t,t));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2141 } else if (t==DOUBLE||t==FLOAT) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2142 if (reg_arg<MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2143 /* sigh...
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2144 printf requires floating value in integer registers
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2145 */
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2146 if (dots) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2147 if (car(e4)==DRLVAR) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2148 special_lvar = cadr(e4);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2149 e5 = list2(LVAR,special_lvar);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2150 } else {
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2151 special_lvar = new_lvar(SIZE_OF_DOUBLE);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2152 g_expr(assign_expr0(
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2153 (e5=list2(LVAR,special_lvar)),e4,DOUBLE,t));
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2154 reg_arg_list = list2(e5,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2155 e4 = list2(DREGISTER,freg);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2156 /* freg should not change until XXX */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2157 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2158 r0=get_input_register_var(reg_arg,0,0);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2159 r1 = reg_arg+1+MIN_TMP_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2160 if (regs[r1]==PTRC_REG)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2161 clear_ptr_cache_reg(list2(REGISTER,r1));
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2162 /* else if (regs[r1]) error(-1); */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2163 r1=get_input_register_var_1(reg_arg+1,0,0);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2164 use_input_reg(cadr(r0),1); /* protect from input register free */
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2165 use_input_reg(cadr(r1),1); /* protect from input register free */
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2166 reg_arg_list = list2(r0,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2167 reg_arg_list = list2(r1,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2168 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
2169 arg_assign = list2( assign_expr0(r1,
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2170 list2(LVAR,special_lvar+SIZE_OF_INT),
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2171 INT,INT), arg_assign);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2172 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2173 }
136
069960078249 remove redundant funcall argument for prototyped code in PowerPC case.
kono
parents: 135
diff changeset
2174 if (dots && freg_arg>=4 && freg_arg<MAX_INPUT_DREGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2175 /* oh my god!
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2176 it requires integer register and floating register and
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2177 stack value. You are crazy.
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2178 */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2179 arg_assign = list2(
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2180 assign_expr0(list2(LVAR,caller_arg_offset_v(nargs)),
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2181 get_input_dregister_var(freg_arg,0,0,1),t,t),
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2182 arg_assign);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2183 }
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2184 reg_arg_list = list2(arg,reg_arg_list);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2185 if (car(arg)==DREGISTER)
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2186 use_input_reg(cadr(arg),1); /* protect from input register free */
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
2187 g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2188 }
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2189 // structs are finished
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2190 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2191 if (max_func_args<nargs) max_func_args=nargs;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2192 for(;arg_assign;arg_assign=cadr(arg_assign)) {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2193 g_expr_u(car(arg_assign));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2194 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2195 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2196 if (car(e2) == FNAME) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2197 printf("\tbl\tL_%s$stub\n",fn->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2198 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2199 jrn = register_name(cadr(jmp));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2200 printf("\tmtctr %s\n",jrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
2201 printf("\tbctrl\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2202 }
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2203 for(;reg_arg_list;reg_arg_list=cadr(reg_arg_list)) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2204 arg = car(reg_arg_list);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2205 if (car(arg)==REGISTER||car(arg)==DREGISTER||car(arg)==FREGISTER
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2206 ||car(arg)==LREGISTER)
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2207 free_register(cadr(arg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2208 else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2209 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2210 if (ret_type==DOUBLE||ret_type==FLOAT) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2211 set_freg(RET_FREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2212 } else if (ret_type==ULONGLONG||ret_type==LONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2213 set_lreg(RET_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2214 use_reg(RET_LREGISTER);
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2215 } else if (ret_type==VOID) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2216 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2217 set_ireg(RET_REGISTER,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2218 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2219 return ret_type;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2220 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2221
917947ffeb7c power pc version
kono
parents:
diff changeset
2222 void
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2223 code_alloca(int e1,int reg)
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2224 {
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2225 char *crn,*grn;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2226 int g;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2227
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2228 g_expr(list3(BAND,list3(ADD,e1,list2(CONST,30)),list2(CONST,~15)));
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2229 use_int(reg);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2230 g = get_register();
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2231 crn = register_name(reg);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2232 grn = register_name(g);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2233 // printf("\trlwinm r0,%s,0,0,27\n",crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2234 printf("\tlwz %s,0(r1)\n",grn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2235 printf("\tneg %s,%s\n",crn,crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2236 printf("\tstwux %s,r1,%s\n",grn,crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2237 // printf("\tstw %s,0(r1)\n",grn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2238 if (!max_func_arg_label) max_func_arg_label = fwdlabel();
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2239 printf("\taddis r1,r1,ha16(L_%d)\n",max_func_arg_label);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2240 printf("\taddi %s,r1,lo16(L_%d)\n",crn,max_func_arg_label);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2241 free_register(g);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2242 }
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2243
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2244 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2245 code_frame_pointer(int e3) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2246 use_int(e3);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2247 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2248 printf("\tmr r1,%s\n",register_name(e3));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2249 #else
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2250 printf("\tmr r30,%s\n",register_name(e3));
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2251 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2252 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2253
917947ffeb7c power pc version
kono
parents:
diff changeset
2254
917947ffeb7c power pc version
kono
parents:
diff changeset
2255 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2256 code_fix_frame_pointer(int disp_offset) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2257 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2258 printf("\tla r30,");
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2259 printf("lo16(%d)(r30)\n",FUNC_LVAR);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2260 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2261
917947ffeb7c power pc version
kono
parents:
diff changeset
2262 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2263 code_jmp(char *s) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2264 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2265 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2266 printf("\tb L_%s$stub\n",s);
283
230a3b98b843 MIPS jump work.
kono
parents: 280
diff changeset
2267 control=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2268 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2269
917947ffeb7c power pc version
kono
parents:
diff changeset
2270
917947ffeb7c power pc version
kono
parents:
diff changeset
2271 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2272 code_indirect_jmp(int e2) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2273 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2274 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2275 use_int(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2276 printf("\tmtctr %s\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
2277 printf("\tbctr\n");
283
230a3b98b843 MIPS jump work.
kono
parents: 280
diff changeset
2278 control=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2279 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2280
355
6188f66c0c0b cond op, and arg scope.
kono
parents: 354
diff changeset
2281 void
6188f66c0c0b cond op, and arg scope.
kono
parents: 354
diff changeset
2282 code_rindirect(int e1, int reg,int offset, int sign,int sz)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2283 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2284 char *crn,*rrn;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2285 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2286 if (!is_int_reg(creg)) error(-1);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2287 crn=register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2288 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2289 rrn=register_name(reg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2290 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2291 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2292 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2293 printf("\t%s %s,lo16(%d)(%s)\n",cload(sz),rrn,offset,crn);
355
6188f66c0c0b cond op, and arg scope.
kono
parents: 354
diff changeset
2294 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2295 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2296
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2297 #if FLOAT_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2298 int
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2299 code_drindirect(int e1, int reg,int offset, int d)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2300 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2301 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2302 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2303 if (!is_int_reg(creg)) error(-1);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2304 crn=register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2305 use_float(d,reg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2306 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2307 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2308 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2309 printf("\t%s %s,lo16(%d)(%s)\n",fload(d),
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2310 fregister_name(reg),offset,crn);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2311
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2312 return d?DOUBLE:FLOAT;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2313 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2314 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2315
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2316 static void
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2317 lload(int creg,int reg,int offset)
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2318 {
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2319 char *crn = register_name(creg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2320 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2321 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2322 }
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2323 if (creg!=regv_h(reg)) {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2324 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset,crn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2325 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_low(reg),offset+SIZE_OF_INT,crn);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2326 } else {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2327 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_low(reg),offset+SIZE_OF_INT,crn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2328 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset,crn);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2329 }
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2330 }
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2331
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2332 #if LONGLONG_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2333 int
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2334 code_lrindirect(int e1, int reg, int offset, int us)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2335 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2336 char *crn;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2337 int creg0;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2338
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2339 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2340 if (!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2341 crn=register_name(creg0=creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2342 use_longlong(reg);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2343 lload(creg0,reg,offset);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2344 return us?ULONGLONG:LONGLONG;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2345 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2346 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2347
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2348 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2349 code_assign_gvar(int e2,int creg,int byte) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2350 use_int(creg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2351 code_ldf(cstore(byte),register_name(creg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2352 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2353 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2354
917947ffeb7c power pc version
kono
parents:
diff changeset
2355 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2356 code_assign_lvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2357 char *crn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2358 use_int(creg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2359 crn=register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2360 lvar_intro(e2);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2361 printf("\t%s %s,",cstore(byte),crn);
165
kono
parents: 164
diff changeset
2362 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2363 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2364
917947ffeb7c power pc version
kono
parents:
diff changeset
2365 void
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2366 code_assign_register(int e2,int byte,int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2367 use_int(creg);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2368 if (e2!=creg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2369 printf("\tmr %s,%s\n",register_name(e2),register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2370 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2371
917947ffeb7c power pc version
kono
parents:
diff changeset
2372 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
2373 code_assign(int e2,int byte,int creg) {
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2374 char *drn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2375 char *crn;
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2376 use_int(e2);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2377 drn=register_name(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2378 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2379 crn=register_name(creg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2380
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2381 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2382 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2383
917947ffeb7c power pc version
kono
parents:
diff changeset
2384
917947ffeb7c power pc version
kono
parents:
diff changeset
2385 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2386 code_register_assop(int e2,int reg, int op,int byte) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2387 // reg <= reg(e2) op=reg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2388 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2389 tosop(op,e2,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2390 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2391
917947ffeb7c power pc version
kono
parents:
diff changeset
2392 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2393 code_assop(int op,int creg, int byte,int sign) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2394 char *xrn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2395 int xreg;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2396 int edx = get_register(); if(!edx) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2397 // (*creg) op = pop()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2398
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2399 use_int(creg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2400 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2401 #if 1
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2402 set_ireg(edx,0);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2403 ld_indexx(byte,0,creg,ireg,sign);
338
7fe7ce0a791f bit-field done for IA32, PowerPC, MIPS.
kono
parents: 336
diff changeset
2404 use_reg(creg); // to clear ptr cache
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2405 tosop(op,ireg,xreg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2406 crn = register_name(ireg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2407 drn = register_name(creg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2408 if (byte==1) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2409 printf("\tstb %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2410 } else if (byte==SIZE_OF_SHORT) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2411 printf("\tsth %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2412 } else {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2413 printf("\tstw %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2414 }
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2415 free_register(creg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2416 emit_pop_free(xreg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2417 #else
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
2418 printf("# assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2419 ld_indexx(byte,0,edx,creg,sign);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2420 tosop(op,creg,xreg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2421 crn = register_name(creg);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2422 drn = register_name(edx);
165
kono
parents: 164
diff changeset
2423 if (byte==1) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2424 printf("\tstb %s,0(%s)\n",crn,drn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2425 } else if (byte==SIZE_OF_SHORT) {
165
kono
parents: 164
diff changeset
2426 printf("\tsth %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2427 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2428 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2429 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2430 free_register(edx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2431 emit_pop_free(xreg);
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2432 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2433 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2434
917947ffeb7c power pc version
kono
parents:
diff changeset
2435 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2436 tosop(int op,int creg,int oreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2437 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2438 int dx = -1;
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2439 int ox = -1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2440 char *orn,*crn,*drn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2441 // creg = creg op oreg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2442
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2443 use_int(creg);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2444 if(oreg==-1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2445 error(-1);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2446 } else if (oreg<= -REG_LVAR_OFFSET) {
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2447 ox = get_register(); if (ox<0) error(-1);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2448 code_rlvar(oreg+REG_LVAR_OFFSET,ox);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2449 oreg = ox;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2450 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2451
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2452 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2453 case LSHIFT:
917947ffeb7c power pc version
kono
parents:
diff changeset
2454 case ULSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2455 shift("slw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2456 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2457 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2458 case RSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2459 shift("sraw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2460 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2461 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2462 case URSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2463 shift("srw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2464 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2465 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2466 }
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2467 orn = register_name(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2468 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
2469 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2470 case ADD:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2471 printf("\tadd %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2472 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2473 case SUB:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2474 printf("\tsub %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2475 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2476 case CMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2477 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2478 printf("\tcmpw cr%d,%s,%s\n",cmpflag,crn,orn);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2479 break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2480 case UCMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2481 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2482 printf("\tcmplw cr%d,%s,%s\n",cmpflag,crn,orn);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2483 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2484 case BAND:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2485 printf("\tand %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2486 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2487 case EOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2488 printf("\txor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2489 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2490 case BOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2491 printf("\tor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2492 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2493 case MUL:
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2494 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2495 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2496 case UMUL:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2497 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2498 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2499 case DIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2500 printf("\tdivw %s,%s,%s\n",crn,crn,orn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2501 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2502 case UDIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2503 printf("\tdivwu %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2504 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2505 case MOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2506 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2507 drn = register_name(dx);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2508 printf("\tdivw %s,%s,%s\n",drn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2509 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2510 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2511 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2512 case UMOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2513 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2514 drn = register_name(dx);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2515 printf("\tdivwu %s,%s,%s\n",drn,crn,orn);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2516 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2517 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2518 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2519 default:
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2520 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2521 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2522 if(dx!=-1) free_register(dx);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2523 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2524 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2525
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2526 int
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2527 code_const_op_p(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2528 {
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2529 if (car(v)!=CONST) return 0;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2530 if (op==DIV||op==UDIV) return ilog(v);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2531 if (op==BAND||op==MOD||op==UMOD) return 0;
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2532 v = cadr(v);
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
2533 return (-32766<v&&v<32767);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2534 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2535
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
2536 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2537 oprtc(int op,int creg, int v)
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2538 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2539 char *crn;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2540 int l;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2541 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2542 crn = register_name(creg);
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2543 v = cadr(v);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2544
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2545 switch(op) {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2546 case LSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2547 case ULSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2548 printf("\tslwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2549 return;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2550 case DIV:
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2551 v = ilog(v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2552 case RSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2553 printf("\tsrawi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2554 return;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2555 case UDIV:
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2556 v = ilog(v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2557 case URSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2558 printf("\tsrwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2559 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2560 case ADD:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2561 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2562 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2563 case SUB:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2564 printf("\taddi %s,%s,lo16(-%d)\n",crn,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2565 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2566 case CMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2567 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2568 printf("\tcmpwi cr%d,%s,lo16(%d)\n",cmpflag,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2569 break;
354
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2570 case UCMP:
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2571 inc_cmpflag();
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2572 printf("\tcmplwi cr%d,%s,lo16(%d)\n",cmpflag,crn,v);
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2573 break;
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2574 case EOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2575 printf("\txori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2576 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2577 case BOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2578 printf("\tori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2579 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2580 case MUL:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2581 case UMUL:
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2582 if ((l=ilog(v))) {
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2583 printf("\tslwi %s,%s,%d\n",crn,crn,l);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2584 } else
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2585 printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2586 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2587 default:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2588 error(-1);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2589 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2590 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2591
917947ffeb7c power pc version
kono
parents:
diff changeset
2592 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2593 shift(char *op, int creg, int reg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2594 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2595 char *crn;
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2596 char *rrn = register_name(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2597 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2598 crn = register_name(creg);
186
6391432ca002 nkf binary fix
kono
parents: 185
diff changeset
2599 printf("\t%s %s,%s,%s\n",op,crn,crn,rrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2600 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2601
917947ffeb7c power pc version
kono
parents:
diff changeset
2602 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2603 ld_indexx(int byte, int n, int xreg,int creg, int sign)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2604 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2605 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2606 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2607 crn = register_name(creg);
246
0dcc0ec81ed2 MIPS on going (90%)
kono
parents: 245
diff changeset
2608 printf("\t%s %s,%d(%s)\n",cload(byte),register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2609 register_name(xreg));
246
0dcc0ec81ed2 MIPS on going (90%)
kono
parents: 245
diff changeset
2610 cext(sign,byte,creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2611 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2612
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2613 int
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2614 code_csvalue()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2615 {
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2616 return creg;
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2617 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2618
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2619 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
2620 code_cmpdimm(int e, int csreg,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2621 {
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2622 int reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2623 /* used in dosiwtch() */
917947ffeb7c power pc version
kono
parents:
diff changeset
2624 if(chk) return;
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2625 inc_cmpflag();
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2626 if (-32767<e&&e<32767) {
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2627 printf("\tcmpwi cr%d,%s,%d\n",cmpflag,register_name(csreg),e);
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2628 jcond(label,cond);
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2629 } else {
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2630 reg = get_register();
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2631 code_const(list2(CONST,e),reg);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2632 printf("\tcmpw cr%d,%s,%s\n",cmpflag,register_name(csreg),register_name(reg));
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2633 jcond(label,cond);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2634 free_register(reg);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2635 }
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 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2639 code_opening(char *filename)
917947ffeb7c power pc version
kono
parents:
diff changeset
2640 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2641 printf("\t.file \"%s\"\n",filename);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2642 /* printf("\t.version\t\"01.01\"\n"); */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2643 /* printf("gcc2_compiled.:\n"); */
917947ffeb7c power pc version
kono
parents:
diff changeset
2644 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2645 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2646
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2647 #define CRBITSIZ 4
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2648
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2649 static int
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2650 rexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2651 {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2652 int t,flag=-1,eq=-1,neg=-1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2653 char *rn;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2654 switch(car(e1)) {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2655 case GT: t=INT; flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2656 case UGT: t=0; flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2657 case GE: t=INT; flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2658 case UGE: t=0; flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2659 case LT: t=INT; flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2660 case ULT: t=0; flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2661 case LE: t=INT; flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2662 case ULE: t=0; flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2663 case EQ: t=INT; flag = 3; break;
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2664 case NEQ: t=INT; flag = 3; neg=3; break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2665 default: return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2666 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2667 g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1)));
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2668 use_int(reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2669 rn = register_name(reg);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2670 t = CRBITSIZ*cmpflag;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2671 if (eq>0) {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2672 printf("\tcror %d,%d,%d\n",t+flag-1,t+eq-1,t+flag-1);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2673 }
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2674 if (neg>0) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2675 neg = t+neg-1,
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2676 printf("\tcrnor %d,%d,%d\n",neg,neg,neg);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2677 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2678 printf("\tmfcr %s\n",rn);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2679 printf("\trlwinm %s,%s,%d,1\n",rn,rn,t+flag);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2680 return 1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2681 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2682
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2683 void
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2684 rexpr(int e1, int l1, int cond,int t)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2685 {
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2686 char *s;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2687 switch(car(e1)) {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2688 case GT: s=code_gt(cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2689 case UGT: s=code_ugt(cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2690 case GE: s=code_ge(cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2691 case UGE: s=code_uge(cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2692 case LT: s=code_ge(!cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2693 case ULT: s=code_uge(!cond);break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2694 case LE: s=code_gt(!cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2695 case ULE: s=code_ugt(!cond);break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2696 case EQ: s=code_eq(cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2697 case NEQ: s=code_eq(!cond); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2698 default: error(-1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2699 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2700 g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1)));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2701 printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2702 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2703
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
2704 static void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2705 jcond(int l, char cond)
917947ffeb7c power pc version
kono
parents:
diff changeset
2706 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2707 if (chk) return;
297
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2708 if (cond==LT) {
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2709 printf("\tb%s cr%d,L_%d\n",code_ge(0),cmpflag,l);
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2710 } else if (cond==1||cond==0) {
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2711 printf("\tb%s cr%d,L_%d\n",cond?"ne":"eq",cmpflag,l);
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2712 } else error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2713 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2714
917947ffeb7c power pc version
kono
parents:
diff changeset
2715 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2716 jmp(int l)
917947ffeb7c power pc version
kono
parents:
diff changeset
2717 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2718 control=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2719 if (chk) return;
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2720 printf("\tb\tL_%d\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2721 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2722
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
2723 extern void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2724 gen_comment(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
2725 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2726 if (chk) return;
307
fda28752d301 stdarg (varargs done... PowerPC, IA32 checked)
kono
parents: 305
diff changeset
2727 printf("## %s",s);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2728 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2729
917947ffeb7c power pc version
kono
parents:
diff changeset
2730 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2731 code_enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2732 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2733 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
2734 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2735 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2736 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2737 if (stmode!=STATIC)
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2738 printf(".globl _%s\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2739 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2740 printf("\t.type\t%s,@function\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2741 #endif
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2742 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
2743 code_disp_label=fwdlabel();
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2744 printf("\tla r1,lo16(L_%d)(r30)\n",code_disp_label);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2745 printf("\tbcl 20,31,L_%d\n",code_base = fwdlabel());
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2746 fwddef(code_base);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2747 printf("\tmflr r31\n");
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2748 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2749 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2750
917947ffeb7c power pc version
kono
parents:
diff changeset
2751
917947ffeb7c power pc version
kono
parents:
diff changeset
2752 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2753 code_enter1(int args)
917947ffeb7c power pc version
kono
parents:
diff changeset
2754 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2755 // set_lreg(LREG_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2756 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2757 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2758 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2759
917947ffeb7c power pc version
kono
parents:
diff changeset
2760 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2761 code_leave(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2762 {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2763 int r1_offsetv;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2764 disp&= -SIZE_OF_INT;
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2765 r1_offsetv = -disp+max_func_args*SIZE_OF_INT+code_disp_offset;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2766
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2767 printf(".set L_%d,%d\n",code_disp_label,-r1_offsetv);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2768 local_table();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2769 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2770 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2771
917947ffeb7c power pc version
kono
parents:
diff changeset
2772 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2773 enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2774 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2775 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
2776 text_mode();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2777 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2778 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2779 if (stmode!=STATIC)
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2780 printf(".globl _%s\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2781 /*
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2782 printf("\t.type\t%s,@function\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2783 */
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2784 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
2785 code_setup=fwdlabel();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2786 printf("\tmflr r0\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2787 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
2788 code_base=fwdlabel();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2789 fwddef(code_base);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2790 r1_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2791 lvar_offset_label = fwdlabel();
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2792 #if 0
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2793 printf("\taddi r30,r1,lo16(-L_%d)\n",lvar_offset_label);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2794 printf("\tstwu r1,lo16(-L_%d)(r1)\n",r1_offset_label);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2795 // printf("\tmr r30,r1\n");
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2796 #else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2797 printf("\taddi r30,r1,lo16(-L_%d)\n",lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2798 printf("\tlis r31,ha16(-L_%d)\n",r1_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2799 printf("\taddi r31,r31,lo16(-L_%d)\n",r1_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2800 printf("\tstwux r1,r1,r31\n");
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2801 #endif
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2802 printf("\tmflr r31\n");
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2803 max_func_args = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2804 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2805
917947ffeb7c power pc version
kono
parents:
diff changeset
2806 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2807 enter1()
917947ffeb7c power pc version
kono
parents:
diff changeset
2808 {
182
e1e9ec8c96a7 some fix
kono
parents: 178
diff changeset
2809 text_mode();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2810 // set_lreg(LREG_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2811 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2812 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
2813 }
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2814
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2815 int
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2816 reg_save_offset()
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2817 {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2818 return -(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2819 (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*SIZE_OF_INT+
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2820 (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*SIZE_OF_DOUBLE
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2821 );
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2822 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2823
917947ffeb7c power pc version
kono
parents:
diff changeset
2824 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2825 leave(int control, char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2826 {
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
2827 int retcont1=0,sz;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2828
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2829 if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2830 reg_save = reg_save_offset();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2831
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2832 if (control) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2833 code_set_return_register(1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2834 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2835 if (retcont) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2836 if (control) jmp(retlabel);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2837 retcont1 = fwdlabel();
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2838 fwddef(retcont);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2839 if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2840 printf("\tfmr f1,f31\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2841 } else if (cadr(fnptr->ty)>0&&(
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2842 car(cadr(fnptr->ty))==STRUCT ||
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2843 car(cadr(fnptr->ty))==UNION)) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2844 sz = size(cadr(fnptr->ty));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2845 printf("\tli r7,%d\n",sz);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2846 printf("\tsubl r6,r7,r30\n");
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2847 printf("\tlwz r3,lo16(%d)(r30)\n",(my_func_args-1)*SIZE_OF_INT);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2848 emit_copy(6,3,sz,0,1,1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2849 } else if (cadr(fnptr->ty)!=VOID) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2850 printf("\tmr r3,r29\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2851 }
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2852 #if !R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2853 printf("\tla r1,lo16(%d)(r30)\n",
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2854 -reg_save+my_func_args*SIZE_OF_INT);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2855 #endif
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2856 printf("\tb L_%d\n",retcont1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2857 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2858 fwddef(retlabel);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2859 printf("\tlwz r1,0(r1)\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2860 if (retcont) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2861 fwddef(retcont1);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2862 }
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2863 if (max_freg_var>=0) {
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2864 printf("\tlmw r%d,%d(r1)\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2865 REG_VAR_BASE-max_reg_var,reg_save);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2866 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
2867 printf("\tb restFP+%d ; restore f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2868 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2869 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
2870 } else {
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2871 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
2872 printf("\tmtlr r0\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2873 printf("\tlmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2874 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
2875 printf("\tblr\n");
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2876 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2877
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2878 disp &= -SIZE_OF_INT;
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2879 fwddef(code_setup);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2880 printf("\tstmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2881 REG_VAR_BASE-max_reg_var,reg_save);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2882 printf("\tstw r0,8(r1)\n");
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2883 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
2884 printf("\tb saveFP+%d ; save f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2885 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2886 FREG_VAR_BASE-max_freg_var);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2887 else {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2888 printf("\tblr\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2889 }
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2890
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2891 code_offset_set();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2892 local_table();
917947ffeb7c power pc version
kono
parents:
diff changeset
2893 labelno++;
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2894 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2895 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2896
917947ffeb7c power pc version
kono
parents:
diff changeset
2897
917947ffeb7c power pc version
kono
parents:
diff changeset
2898 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2899 code_set_return_register(int mode) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2900 if (cadr(fnptr->ty)==DOUBLE||cadr(fnptr->ty)==FLOAT) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2901 set_freg(RET_FREGISTER,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2902 } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2903 set_lreg(RET_LREGISTER,mode);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2904 } else if (cadr(fnptr->ty)==VOID) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2905 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2906 set_ireg(RET_REGISTER,mode);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2907 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2908 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2909
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2910 int
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2911 code_get_fixed_creg(int reg,int type) {
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2912 return creg;
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2913 }
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2914
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2915 void
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2916 code_set_fixed_creg(int reg,int mode,int type) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2917 if (type==FLOAT||type==DOUBLE) {
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2918 set_freg(reg,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2919 } else if (type==LONGLONG||type==ULONGLONG) {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2920 set_lreg(reg,mode);
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
2921 // use_reg(reg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2922 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2923 set_ireg(reg,mode);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2924 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2925 }
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2926
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2927 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2928 gen_gdecl(char *n, int gpc)
917947ffeb7c power pc version
kono
parents:
diff changeset
2929 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2930 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2931 if (stmode!=STATIC)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2932 printf(".globl _%s\n",n);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2933 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2934 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2935
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2936 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2937 ascii(char *s)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2938 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2939 printf("\t.ascii \"");
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2940 while(*s) {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2941 if (*s=='\n')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2942 printf("%cn",92);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2943 else if (*s<' ')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2944 printf("%c%03o",92,*s);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2945 else if (*s=='\\')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2946 printf("\\\\");
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2947 else if (*s==34)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2948 printf("%c%c",92,34);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2949 else
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2950 printf("%c",*s);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2951 s++;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2952 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2953 printf("\\0%c\n\t.align 2\n",34);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2954 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2955
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2956 extern int
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2957 emit_string_label() {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2958 int lb;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2959
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2960 printf(".data\t\n.cstring\n\t.align 2\n");
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2961 lb=fwdlabel();
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2962 printf("L_%d:\n",lb);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2963 output_mode = RODATA_EMIT_MODE;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2964 return lb;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2965 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2966
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2967 extern void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2968 align(int t)
917947ffeb7c power pc version
kono
parents:
diff changeset
2969 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2970 if (t!=CHAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2971 if (data_alignment & 1)
917947ffeb7c power pc version
kono
parents:
diff changeset
2972 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2973 data_alignment = 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
2974 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2975 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2976
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2977 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2978 emit_global(char *name,int t)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2979 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2980 printf(".globl\t_%s\n",name);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2981 data_mode(name);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2982 align(t);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2983 printf("_%s:\n",name);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2984 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2985
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2986 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2987 emit_space(int sp)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2988 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2989 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2990 printf("\t.space\t%d\n",sp);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2991 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2992
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2993 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2994 emit_char(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2995 {
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2996 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2997 printf("\t.byte %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2998 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2999
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3000 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3001 emit_short(int d)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3002 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3003 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3004 printf("\t.short %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3005 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3006
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3007 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3008 emit_int(int d)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3009 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3010 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3011 printf("\t.long %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3012 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3013
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3014 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3015 emit_longlong(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3016 {
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3017 #if LONGLONG_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3018 long long d = lcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3019 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3020 printf("\t.long\t0x%x,0x%x\n",code_l2(d),code_l1(d));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3021 #endif
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3022 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3023
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3024 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3025 emit_double(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3026 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3027 #if FLOAT_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3028 double d = dcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3029 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3030 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
339
375d21a2b845 emit_data
kono
parents: 338
diff changeset
3031 #endif
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3032 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3033
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3034 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3035 emit_float(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3036 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3037 #if FLOAT_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3038 float f = dcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3039 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3040 printf("\t.long\t0x%x\n",*(int *)&f);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3041 #endif
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3042 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3043
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3044 extern void
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3045 emit_address(char *s,int offset)
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3046 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3047 data_mode(0);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3048 if (offset)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3049 printf("\t.long _%s+%d\n",s,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3050 else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3051 printf("\t.long _%s\n",s);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3052 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3053
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3054 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3055 emit_label(int labelno)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3056 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3057 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3058 printf("\t.long L_%d\n",labelno);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3059 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3060
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3061 extern void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3062 emit_data_closing(NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
3063 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3064 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3065 int lb;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3066 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3067 if (chk) return;
917947ffeb7c power pc version
kono
parents:
diff changeset
3068 if (mode==GDECL) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3069 data_mode(0);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3070 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3071 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3072 printf("L_%d:\n",lb);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3073 printf("\t.size\t%s,L_%d-%s\n",n->nm,lb,n->nm);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3074 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3075 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3076 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3077
917947ffeb7c power pc version
kono
parents:
diff changeset
3078 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3079 global_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
3080 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3081 NMTBL *n;
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3082 int init; char *extrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3083 init=0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3084 for(n = global_list;n!=&null_nptr;n = n->next) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3085 if ((n->sc == GVAR) && n->dsp != -1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3086 /* n->dsp = -1 means initialized global */
917947ffeb7c power pc version
kono
parents:
diff changeset
3087 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3088 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
3089 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
3090 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3091 printf(".comm _%s,%d\n",n->nm,size(n->ty));
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3092 } else if ((n->sc==STATIC) && n->dsp != -1) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3093 /* n->dsp = -1 means initialized global */
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3094 if (init==0) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3095 data_mode(0);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3096 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3097 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3098 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3099 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3100 }
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3101 for(n = global_list;n!=&null_nptr;n = n->next) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3102 if (is_code(n)||is_function(n)) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3103 extrn = n->nm;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3104 if (n->sc==EXTRN1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3105 data_mode(0);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3106 printf(".picsymbol_stub\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3107 printf("L_%s$stub:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3108 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3109 printf("\tmflr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3110 printf("\tbcl 20,31,L0$_%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3111 printf("L0$_%s:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3112 printf("\tmflr r11\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3113 printf("\taddis r11,r11,ha16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3114 printf("\tmtlr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3115 printf("\tlwz r12,lo16(L_%s$lazy_ptr-L0$_%s)(r11)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3116 printf("\tmtctr r12\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3117 printf("\taddi r11,r11,lo16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3118 printf("\tbctr\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3119 printf(".data\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3120 printf(".lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3121 printf("L_%s$lazy_ptr:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3122 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3123 printf("\t.long dyld_stub_binding_helper\n");
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3124 } else if (n->sc==FUNCTION||n->sc==CODE) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3125 text_mode();
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3126 printf("\t.set L_%s$stub,_%s\n",extrn,extrn);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3127 data_mode(0);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3128 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
3129 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3130 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3131 }
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3132 init=0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3133 for(n = global_list;n!=&null_nptr;n = n->next) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3134 if (n->sc == GVAR) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3135 if (init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3136 printf(".data\n");
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3137 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3138 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
3139 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
3140 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3141 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3142 init = 0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3143 for(n = global_list;n!=&null_nptr;n = n->next) {
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
3144 if (is_code(n)||is_function(n)) continue;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3145 if (n->sc==EXTRN1) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3146 if(init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3147 printf(".data\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3148 printf(".non_lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3149 init=1;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3150 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3151 printf("L_%s$non_lazy_ptr:\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3152 printf("\t.indirect_symbol _%s\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3153 printf("\t.long\t0\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3154 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3155 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3156 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3157
917947ffeb7c power pc version
kono
parents:
diff changeset
3158 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3159 local_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
3160 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3161 NMTBL *n;
917947ffeb7c power pc version
kono
parents:
diff changeset
3162 int init;
917947ffeb7c power pc version
kono
parents:
diff changeset
3163 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
3164 /* static local variables */
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3165 for(n = local_static_list;n!=&null_nptr;n = n->next) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3166 if (n->sc == GVAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3167 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3168 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
3169 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
3170 }
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
3171 if (n->dsp != -1) /* initialized static */
da529eab5618 static initialization
kono
parents: 153
diff changeset
3172 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
da529eab5618 static initialization
kono
parents: 153
diff changeset
3173 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
3174 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3175 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3176 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3177
917947ffeb7c power pc version
kono
parents:
diff changeset
3178 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3179 text_mode(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
3180 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3181 if (output_mode!=TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3182 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3183 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3184 output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
3185 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3186 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3187
917947ffeb7c power pc version
kono
parents:
diff changeset
3188 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3189 data_mode(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
3190 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3191 if (output_mode!=DATA_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3192 printf(".data\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3193 output_mode = DATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
3194 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3195 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3196 if (name)
917947ffeb7c power pc version
kono
parents:
diff changeset
3197 printf("\t.type\t%s,@object\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3198 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3199 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3200
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3201 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3202
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3203 /* floating point */
917947ffeb7c power pc version
kono
parents:
diff changeset
3204
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3205 static int float_one_lib_used=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3206 static char *float_one_lib[] = {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3207 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3208 /* ".literal8", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3209 " .align 3",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3210 "__float_one:",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3211 " .long 1065353216",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3212 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3213 /* ".set L__float_one$non_lazy_ptr,__float_one", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3214 0
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3215 };
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3216 static int float_zero_lib_used=0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3217 static char *float_zero_lib[] = {
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3218 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3219 /* ".literal8", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3220 " .align 3",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3221 "__float_zero:",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3222 " .long 0",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3223 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3224 /* ".set L__float_zero$non_lazy_ptr,__float_zero", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3225 0
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3226 };
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3227
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3228 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
3229 fstore(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3230 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3231 return (d?"stfd":"stfs");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3232 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3233
917947ffeb7c power pc version
kono
parents:
diff changeset
3234 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
3235 fload(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3236 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3237 return d?"lfd":"lfs";
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3238 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3239
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3240 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3241 code_cmp_dregister(int e2,int d,int label,int cond)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3242 {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3243 char *frn,*rrn,*grn;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3244 int greg,r;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3245 grn = register_name(greg = get_dregister(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3246 use_float(d,e2);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
3247 frn = register_name(e2);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3248 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3249 r = get_ptr_cache(&float_zero);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3250 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3251 printf("\tlfs %s,0(%s)\n",grn,rrn);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3252 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3253 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,grn,frn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3254 free_register(greg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3255 jcond(label,cond);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3256 return;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3257 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3258
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3259 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3260 code_dregister(int e2,int freg,int d)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3261 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3262 use_float(d,freg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3263 if (freg!=e2) {
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3264 if (is_int_reg(e2)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3265 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3266 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3267 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3268
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3269 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3270 code_dassign_gvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3271 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3272 use_float(d,freg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3273 code_ldf(fstore(d),fregister_name(freg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3274 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3275 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3276
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3277 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3278 code_dassign_lvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3279 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3280 use_float(d,freg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3281 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3282 printf("\t%s %s,",fstore(d),fregister_name(freg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3283 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3284 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3285
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3286 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3287 code_dassign(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3288 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3289 use_float(d,freg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3290 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3291 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3292
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3293 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3294 code_dassign_dregister(int e2,int d,int freg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3295 use_float(d,freg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3296 if (e2!=freg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3297 printf("\tfmr %s,%s\n",fregister_name(e2),fregister_name(freg));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3298 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3299 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3300
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3301 static double d0 = 1.0;
917947ffeb7c power pc version
kono
parents:
diff changeset
3302
917947ffeb7c power pc version
kono
parents:
diff changeset
3303 int
917947ffeb7c power pc version
kono
parents:
diff changeset
3304 code_d1(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3305 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3306 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3307 return (i[1] == 0x3ff00000)?j[0]:j[1];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3308 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3309
917947ffeb7c power pc version
kono
parents:
diff changeset
3310 int
917947ffeb7c power pc version
kono
parents:
diff changeset
3311 code_d2(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3312 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3313 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3314 return (i[1] == 0x3ff00000)?j[1]:j[0];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3315 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3316
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3317 int
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3318 code_f(double d)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3319 {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3320 float f = d;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3321 int *j = (int *)&f;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3322 return *j;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3323 }
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3324
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3325 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3326
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3327 code_dconst(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3328 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3329 int lb;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3330 double value = dcadr(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3331 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3332 char *rrn,*frn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3333
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3334 use_float(d,freg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3335 frn = fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3336 if (value==0.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3337 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3338 r = get_ptr_cache(&float_zero);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3339 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3340 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3341 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3342 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3343 if (value==1.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3344 float_one_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3345 r = get_ptr_cache(&float_one);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3346 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3347 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3348 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3349 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3350 rrn = register_name((r=get_register()));
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
3351 use_reg(r); // to clear ptr cache
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3352 printf(" \t.data\n\t.align 3\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3353 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3354 printf("L_%d:\n",lb);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3355 if (d) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3356 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
3357 } else {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3358 printf("\t.long\t0x%x\n",code_f(value));
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3359 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3360 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3361 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3362 } else {
917947ffeb7c power pc version
kono
parents:
diff changeset
3363 text_mode();
917947ffeb7c power pc version
kono
parents:
diff changeset
3364 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3365 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",rrn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3366 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
3367 if (d) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3368 printf("\tlfd %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3369 } else {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3370 printf("\tlfs %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3371 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3372 free_register(r);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3373 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3374
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3375
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3376 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3377 code_dneg(int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3378 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3379 char *frn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3380 use_float(d,freg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3381 frn = fregister_name(freg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3382 printf("\tfneg %s,%s\n",frn,frn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3383 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3384
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3385 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3386 code_d2i()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3387 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3388 char *frn;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3389 char *crn;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3390 int e2 = new_lvar(SIZE_OF_DOUBLE);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3391
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3392 use_double0();
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3393 frn = fregister_name(freg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3394 use_int0();
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3395 crn = register_name(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3396
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3397 free_lvar(e2);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
3398 printf("\tfctiwz %s,%s\n",frn,frn);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3399 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3400 printf("\tstfd %s,",frn); lvar(e2);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3401 lvar_intro(e2+SIZE_OF_DOUBLE-SIZE_OF_INT);
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3402 printf("\tlwz %s,",crn); lvar(e2+SIZE_OF_DOUBLE-SIZE_OF_INT);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3403 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3404
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3405 static int i2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3406 static char *i2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3407 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3408 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3409 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3410 "__i2dLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3411 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3412 " .long -2147483648",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3413 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3414 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3415 "i2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3416 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3417 " bcl 20,31,__i2dL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3418 "__i2dL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3419 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3420 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3421 " xoris r3,r3,0x8000",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3422 " stw r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3423 " lis r0,0x4330",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3424 " stw r0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3425 " lfd f0,-32(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3426 " addis r9,r10,ha16(__i2dLC0-__i2dL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3427 " lfd f1,lo16(__i2dLC0-__i2dL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3428 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3429 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3430 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3431 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3432
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3433 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3434 code_i2d()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3435 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3436 i2d_lib_used = 1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3437 clear_ptr_cache();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3438 code_save_stacks();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3439 set_ireg(RET_REGISTER,1);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3440 printf("\tbl i2d_\n");
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
3441 set_freg(RET_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3442 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3443
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3444 static int d2u_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3445 static char *d2u_lib[] = {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3446 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3447 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3448 "__d2uLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3449 " .long 1105199104",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3450 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3451 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3452 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3453 "d2u_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3454 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3455 " bcl 20,31,__d2uL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3456 "__d2uL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3457 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3458 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3459 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3460 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3461 " fcmpu cr0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3462 " cror 2,1,2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3463 " beq- cr0,__d2uL2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3464 " fctiwz f0,f1",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3465 " stfd f0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3466 " lwz r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3467 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3468 "__d2uL2:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3469 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3470 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3471 " fsub f0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3472 " fctiwz f0,f0",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3473 " stfd f0,-24(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3474 " lwz r3,-20(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3475 " xoris r3,r3,0x8000",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3476 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3477 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3478 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3479
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3480 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3481 code_d2u()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3482 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3483 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3484 clear_ptr_cache();
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3485 d2u_lib_used=1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
3486 set_freg(RET_FREGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3487 printf("\tbl d2u_\n");
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3488 set_ireg(RET_REGISTER,0);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3489 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3490
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3491 static int u2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3492 static char *u2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3493 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3494 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3495 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3496 "__u2dLC1:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3497 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3498 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3499 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3500 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3501 "u2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3502 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3503 " bcl 20,31,__u2dL2$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3504 "__u2dL2$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3505 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3506 " mtlr r0",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3507 " stw r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3508 " lis r0,0x4330",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3509 " stw r0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3510 " lfd f0,-32(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3511 " addis r9,r10,ha16(__u2dLC1-__u2dL2$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3512 " lfd f1,lo16(__u2dLC1-__u2dL2$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3513 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3514 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3515 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3516 };
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3517
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3518 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3519 code_u2d()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3520 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3521 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3522 clear_ptr_cache();
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3523 u2d_lib_used = 1;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3524 set_ireg(RET_REGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3525 printf("\tbl u2d_\n");
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
3526 set_freg(RET_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3527 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3528
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3529 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3530 code_d2f() { }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3531 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3532 code_f2d() { }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3533 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3534 code_f2i() { code_d2i(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3535 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3536 code_f2u() { code_d2u(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3537 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3538 code_i2f() { code_i2d(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3539 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3540 code_u2f() { code_u2d(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3541
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3542 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3543 code_drgvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3544 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3545 use_float(d,freg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3546 code_ldf(fload(d),fregister_name(freg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3547 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3548 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3549
917947ffeb7c power pc version
kono
parents:
diff changeset
3550
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3551 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3552 code_drlvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3553 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3554 use_float(d,freg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3555 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3556 printf("\t%s %s,",fload(d),fregister_name(freg)); lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3557 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3558
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3559 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3560 code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3561 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3562 char *frn;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3563 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3564 char *grn=fregister_name(g);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3565
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3566 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3567 frn=fregister_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3568
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3569 code_ldf(fload(1),grn,cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3570 get_ptr_cache((NMTBL*)caddr(e2)));
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3571 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3572 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3573 free_register(g);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3574 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3575 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3576
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3577 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3578 code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3579 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3580 char *frn;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3581 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3582 char *grn=fregister_name(g);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3583
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3584 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3585 frn=fregister_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3586
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3587 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3588 printf("\t%s %s,",fload(1),grn); lvar(e2);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3589 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3590 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3591 free_register(g);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3592 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3593 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3594
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3595 void
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3596 dtosop(int op,int reg,int oreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3597 {
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
3598 char *opn="";
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3599 char *frn;
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3600 char *grn;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3601 int ox = -1;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3602
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3603 use_float(1,reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3604 if(oreg==-1) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3605 error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3606 } else if (oreg<= -REG_LVAR_OFFSET) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3607 ox = get_dregister(1); if (ox<0) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3608 use_reg(ox);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3609 code_drlvar(oreg+REG_LVAR_OFFSET,1,ox);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3610 oreg = ox;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3611 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3612 grn=fregister_name(oreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3613 frn=fregister_name(reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3614 switch(op) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3615 case FADD:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3616 case DADD: opn="fadd"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3617 case FSUB:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3618 case DSUB: opn="fsub"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3619 case FDIV:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3620 case DDIV: opn="fdiv"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3621 case FMUL:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3622 case DMUL: opn="fmul"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3623 case FCMP:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3624 case DCMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3625 inc_cmpflag();
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3626 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3627 if (ox!=-1) free_register(ox);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3628 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3629 case FCMPGE:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3630 case DCMPGE:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3631 inc_cmpflag();
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3632 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3633 if (ox!=-1) free_register(ox);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3634 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3635 default:
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3636 error(-1); return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3637 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3638 printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3639 if (ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3640 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3641
917947ffeb7c power pc version
kono
parents:
diff changeset
3642 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3643 code_dassop(int op,int reg,int d) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3644 /* we have lvalue in creg, applied floating value is in freg */
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3645 // (*creg) op = pop()
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3646 int xreg=emit_dpop(d);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3647 char *crn;
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
3648 char *frn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3649
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3650 crn=register_name(ireg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3651 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3652 frn =fregister_name(reg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
3653
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3654 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3655 dtosop(op,reg,xreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3656 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3657 emit_dpop_free(xreg,d);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3658 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3659
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3660 void
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3661 code_register_dassop(int reg,int op,int d) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3662 // reg op= dpop()
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3663 int xreg=emit_dpop(d);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3664 dtosop(op,reg,xreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3665 emit_dpop_free(xreg,d);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3666 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3667
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3668 static int
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3669 code_dload_1(int d)
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3670 {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3671 int r,g;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3672 char *drn,*grn;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3673 // load 1
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3674 float_one_lib_used=1;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3675 r = get_ptr_cache(&float_one);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3676 drn=register_name(r);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3677 grn=fregister_name(g=get_dregister(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3678 printf("\tlfs %s,0(%s)\n",grn,drn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3679 return g;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3680 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3681
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3682 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
3683 code_dpreinc(int e1,int e2,int d,int reg) {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3684 char *frn,*crn,*grn;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3685 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3686
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
3687 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3688 crn=register_name(cadr(e2));
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3689 grn = fregister_name(g = code_dload_1(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3690 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3691 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3692 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3693 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3694 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3695 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",crn,crn,grn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3696 if (use && reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3697 printf("\tfmr %s,%s\n",frn,crn);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3698 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3699 g_expr(e2);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3700 if (!is_int_reg(creg)) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3701 crn=register_name(ireg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3702 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3703 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3704 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3705 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3706 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3707 grn = fregister_name(g = code_dload_1(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3708 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3709 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",frn,frn,grn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3710 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3711 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3712 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3713 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3714
917947ffeb7c power pc version
kono
parents:
diff changeset
3715 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
3716 code_dpostinc(int e1,int e2,int d,int reg) {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3717 char *frn,*crn,*grn;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3718 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3719
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
3720 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3721 crn=register_name(cadr(e2));
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3722 grn = fregister_name(g = code_dload_1(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3723 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3724 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3725 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3726 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3727 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3728 if (use && reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3729 printf("\tfmr %s,%s\n",frn,crn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3730 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",crn,crn,grn);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3731 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3732 g_expr(e2);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3733 if (!is_int_reg(creg)) error(-1);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3734 crn=register_name(ireg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3735 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3736 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3737 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3738 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3739 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3740 grn = fregister_name(g = code_dload_1(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3741 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3742 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",grn,frn,grn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3743 printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3744 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3745 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3746 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3747
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3748 static int
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3749 drexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3750 {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3751 int flag=-1,eq=-1,neg=-1,t;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3752 char *rn;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3753 switch(car(e1)) {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3754 case DOP+GT: case FOP+GT: flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3755 case DOP+GE: case FOP+GE: flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3756 case DOP+LT: case FOP+LT: flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3757 case DOP+LE: case FOP+LE: flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3758 case DOP+EQ: case FOP+EQ: flag = 3; break;
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3759 case DOP+NEQ: case FOP+NEQ: flag = 3; neg=3; break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3760 default: return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3761 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3762 g_expr(list3(DCMP,cadr(e1),caddr(e1)));
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3763 use_int(reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3764 rn = register_name(reg);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3765 t = CRBITSIZ*cmpflag;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3766 if (eq>0) {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3767 printf("\tcror %d,%d,%d\n",t+flag-1,t+eq-1,t+flag-1);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3768 }
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3769 if (neg>0) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3770 neg = t+neg-1,
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3771 printf("\tcrnor %d,%d,%d\n",neg,neg,neg);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3772 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3773 printf("\tmfcr %s\n",rn);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3774 printf("\trlwinm %s,%s,%d,1\n",rn,rn,t+flag);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3775 return 1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3776 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3777
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3778 void
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3779 drexpr(int e1, int e2,int l1, int op,int cond)
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3780 {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
3781 if (!cond) {
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3782 switch(op) {
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3783 case FOP+GT:
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
3784 drexpr(e2,e1,l1,FOP+GE,1); return;
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3785 case FOP+GE:
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
3786 drexpr(e2,e1,l1,FOP+GT,1); return;
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3787 case FOP+EQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3788 op=FOP+NEQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3789 case FOP+NEQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3790 op=FOP+EQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3791 case DOP+GT:
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
3792 drexpr(e2,e1,l1,DOP+GE,1); return;
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3793 case DOP+GE:
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
3794 drexpr(e2,e1,l1,DOP+GT,1); return;
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3795 case DOP+EQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3796 op=DOP+NEQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3797 case DOP+NEQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3798 op=DOP+EQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3799 }
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3800 }
234
eccea7c904ee float powerpc drexp done (?)
kono
parents: 233
diff changeset
3801 g_expr(list3(DCMP, e1,e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3802 switch(op) {
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3803 case DOP+GT: case FOP+GT:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3804 printf("\tbgt\tcr%d,L_%d\n",cmpflag,l1);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3805 break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3806 case DOP+GE: case FOP+GE:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3807 printf("\tbge\tcr%d,L_%d\n",cmpflag,l1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3808 break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3809 case DOP+EQ: case FOP+EQ:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3810 printf("\tbeq\tcr%d,L_%d\n",cmpflag,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3811 break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3812 case DOP+NEQ: case FOP+NEQ:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3813 printf("\tbne\tcr%d,L_%d\n",cmpflag,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3814 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3815 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3816 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3817
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3818 int emit_dpop(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3819 {
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
3820 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3821 xreg=pop_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3822 if (xreg<= -REG_LVAR_OFFSET) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3823 reg = get_dregister(d);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3824 code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
3825 free_lvar(REG_LVAR_OFFSET+xreg);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
3826 xreg=reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3827 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3828 return xreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3829 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3830
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3831 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3832 emit_dpop_free(int e1,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3833 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3834 free_register(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3835 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3836
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3837 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3838 emit_dpush(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3839 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3840 int new_reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3841 if (!is_float_reg(creg)) error(-1);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3842 if (freg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3843 new_reg = get_dregister(1); /* ���Ф˼��� */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3844 freg_stack[freg_sp++] = freg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3845 creg = freg = new_reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3846 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3847
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3848 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3849
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3850 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3851
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3852
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3853 /* 64bit int part */
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3854 static void
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3855 lmove(int to,int from) // to = from
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3856 {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3857 int tmp;
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3858 if (regv_h(to)==regv_l(from)&&(regv_l(to)==regv_h(from))) {
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3859 tmp = get_register();
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
3860 printf("\tmr %s,%s\n",register_name(tmp),lregister_name_low(from));
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3861 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3862 printf("\tmr %s,%s\n",lregister_name_low(to),register_name(tmp));
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3863 free_register(tmp);
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3864 } else if (regv_h(to)==regv_l(from)) {
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3865 printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3866 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3867 } else {
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3868 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3869 printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3870 }
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3871 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3872
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3873 static void
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3874 pcond(char *s,int cmpflag,int l1)
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3875 {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3876 printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3877 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3878
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3879 static int
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3880 lcmp(int op,int cond)
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3881 {
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3882 if (op==LOP+UGT||op==LOP+UGE) {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3883 return UCMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3884 } else if (op==LOP+LE||op==LOP+GE) {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3885 return CMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3886 } else {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3887 return CMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3888 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3889 }
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3890
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3891 void
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3892 lrexpr(int e1, int e2,int l1, int op,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3893 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3894 int reg;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3895 int e3;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3896 int l2;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3897 int op1,cr0,cr1;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3898
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3899 g_expr(e1);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3900 emit_lpush();
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3901 g_expr(e2);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3902 e3 = emit_lpop();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3903 if (!is_longlong_reg(creg)) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3904 reg = lreg;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3905 op1 = lcmp(op,cond);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3906 tosop(op1,regv_h(e3),regv_h(reg));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3907 cr0 = cmpflag;
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3908 tosop(op1,regv_l(e3),regv_l(reg));
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3909 cr1 = cmpflag;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3910
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3911 l2 = fwdlabel();
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3912 // cond==0 jump on false condtion ( if(x) => rexpr(.. cond=0 ...) )
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3913 switch(op) {
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3914 case LOP+GT:
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3915 case LOP+GE:
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3916 pcond(code_gt(1),cr0,cond?l1:l2);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3917 pcond(code_eq(0),cr0,cond?l2:l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3918 break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3919 case LOP+UGT:
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3920 case LOP+UGE:
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3921 pcond(code_ugt(1),cr0,cond?l1:l2);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3922 pcond(code_eq(0), cr0,cond?l2:l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3923 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3924 case LOP+EQ:
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3925 pcond(code_eq(0),cr0,(cond?l2:l1));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3926 pcond(code_eq(cond),cr1,l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3927 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3928 case LOP+NEQ:
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3929 pcond(code_eq(0),cr0,(cond?l1:l2));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3930 pcond(code_eq(!cond),cr1,l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3931 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3932 default:
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3933 error(-1);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3934 }
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3935 switch(op) {
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3936 case LOP+GT: pcond(code_gt(cond), cr1,l1); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3937 case LOP+GE: pcond(code_ge(cond), cr1,l1); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3938 case LOP+UGT: pcond(code_ugt(cond), cr1,l1); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3939 case LOP+UGE: pcond(code_uge(cond), cr1,l1); break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3940 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3941 fwddef(l2);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3942 emit_lpop_free(e3);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3943 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3944
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3945 int
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3946 emit_lpop()
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3947 {
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3948 int xreg,reg;
237
1933266f1efa long long ia32 (imcomplete)
kono
parents: 234
diff changeset
3949 xreg=lreg_stack[--lreg_sp];
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3950 if (xreg<= -REG_LVAR_OFFSET) {
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3951 reg = get_lregister();
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3952 code_lrlvar(REG_LVAR_OFFSET+xreg,reg);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3953 free_lvar(REG_LVAR_OFFSET+xreg);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3954 xreg = reg;
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3955 }
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3956 return xreg;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3957 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3958
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3959 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3960 code_lregister(int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3961 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3962 use_longlong(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3963 if (reg!=e2) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3964 lmove(reg,e2);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3965 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3966 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3967
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3968 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3969 code_cmp_lregister(int reg,int label,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3970 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3971 use_longlong(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3972 printf("\tor %s,%s,%s\n",
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3973 lregister_name_low(reg),
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3974 lregister_name_low(reg),
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3975 lregister_name_high(reg));
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3976 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3977 printf("\tcmpwi cr%d,%s,0\n",cmpflag,lregister_name_low(reg));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3978 jcond(label,cond);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3979 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3980
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3981 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3982 code_cmp_lrgvar(int e1,int creg,int label,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3983 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3984 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3985 code_lrgvar(e1,creg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3986 code_cmp_lregister(creg,label,cond);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3987 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3988
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3989 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3990 code_cmp_lrlvar(int e1,int creg,int label,int cond)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3991 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3992 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3993 code_lrlvar(e1,creg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3994 code_cmp_lregister(creg,label,cond);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3995 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3996
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3997 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3998 code_lassign(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3999 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4000 char *drn = register_name(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4001 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4002 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4003
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4004 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4005 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4006 crn_l = lregister_name_low(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4007
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
4008 printf("\tstw %s,0(%s)\n",crn_h,drn);
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
4009 printf("\tstw %s,%d(%s)\n",crn_l,SIZE_OF_INT,drn);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4010 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4011
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4012 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4013 code_lassign_gvar(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4014 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4015 int r;
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4016 use_longlong(creg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4017 r = get_ptr_cache((NMTBL*)caddr(e2));
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4018 code_ldf(cstore(0),lregister_name_high(creg),cadr(e2),r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4019 code_ldf(cstore(0),lregister_name_low(creg),cadr(e2)+SIZE_OF_INT,r);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4020 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4021
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4022 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4023 code_lassign_lvar(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4024 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4025 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4026 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4027
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4028 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4029 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4030 crn_l = lregister_name_low(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4031 lvar_intro(e2);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4032 printf("\tstw %s,",crn_h);lvar(e2);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4033 printf("\tstw %s,",crn_l);lvar(e2+SIZE_OF_INT);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4034 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4035
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4036 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4037 code_lassign_lregister(int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4038 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4039 use_longlong(reg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4040 if (e2!=reg) {
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4041 lmove(e2,reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4042 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4043 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4044
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4045 static long long ll0 = 1LL;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4046
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4047 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4048 code_l1(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4049 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4050 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4051 return (i[1] == 1)?j[1]:j[0];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4052 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4053
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4054 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4055 code_l2(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4056 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4057 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4058 return (i[1] == 1)?j[0]:j[1];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4059 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4060
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4061 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4062 code_lconst(int e1,int creg)
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4063 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4064 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4065 code_const(code_l1(lcadr(e1)),regv_l(creg));
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4066 code_const(code_l2(lcadr(e1)),regv_h(creg));
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4067 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4068
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4069 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4070 code_lneg(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4071 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4072 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4073 printf("\tsubfic %s,%s,0\n",
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4074 lregister_name_low(creg),lregister_name_low(creg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4075 printf("\tsubfze %s,%s\n",
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4076 lregister_name_high(creg),lregister_name_high(creg));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4077 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4078
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4079 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4080 code_lrgvar(int e1,int creg)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4081 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4082 int r;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4083 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4084 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4085 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4086 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4087 crn_l = lregister_name_low(creg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4088 r = get_ptr_cache((NMTBL*)caddr(e1));
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4089 code_ldf(cload(0),crn_h,cadr(e1),r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4090 code_ldf(cload(0),crn_l,cadr(e1)+SIZE_OF_INT,r);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4091 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4092
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4093 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4094 code_lrlvar(int e1,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4095 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4096 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4097 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4098 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4099 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4100 crn_l = lregister_name_low(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4101 lvar_intro(e1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4102 printf("\tlwz %s,",crn_h); lvar(e1);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4103 printf("\tlwz %s,",crn_l); lvar(e1+SIZE_OF_INT);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4104 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4105
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4106 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4107 static int lumod_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4108 static char *lumod_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4109 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4110
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4111 static int lmod_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4112 static char *lmod_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4113 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4114
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4115 static int ludiv_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4116 static char *ludiv_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4117 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4118
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4119 static int ldiv_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4120 static char *ldiv_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4121 };
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4122 #endif
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4123
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4124 static int lsrd_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4125 static char *lsrd_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4126 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4127 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4128 "lsrd__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4129 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4130 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4131 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4132 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4133 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4134 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4135 " bgt+ cr7,L__lsrd1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4136 " neg r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4137 " lwz r2,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4138 " li r9,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4139 " srw r2,r2,r0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4140 " stw r9,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4141 " b L__lsrd2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4142 "L__lsrd1: lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4143 " slw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4144 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4145 " srw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4146 " srw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4147 " stw r0,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4148 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4149 "L__lsrd2: stw r2,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4150 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4151 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4152 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4153 0
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4154 };
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4155
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4156 static int asld_lib_used=0;
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4157 static char *asld_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4158 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4159 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4160 "asld__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4161 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4162 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4163 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4164 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4165 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4166 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4167 " bgt+ cr7,L__asld1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4168 " neg r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4169 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4170 " li r9,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4171 " slw r2,r2,r0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4172 " stw r9,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4173 " b L__asld2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4174 "L__asld1: lwz r0,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4175 " srw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4176 " lwz r2,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4177 " slw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4178 " slw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4179 " stw r0,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4180 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4181 "L__asld2: stw r2,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4182 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4183 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4184 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4185 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4186 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4187
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4188 static int asrd_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4189 static char *asrd_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4190 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4191 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4192 "asrd__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4193 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4194 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4195 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4196 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4197 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4198 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4199 " bgt+ cr7,L__asrd1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4200 " lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4201 " neg r2,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4202 " sraw r2,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4203 " srawi r0,r0,31",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4204 " b L__asrd2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4205 "L__asrd1: lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4206 " slw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4207 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4208 " sraw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4209 " srw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4210 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4211 "L__asrd2: stw r0,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4212 " stw r2,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4213 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4214 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4215 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4216 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4217 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4218
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4219 static void
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4220 extern_conv(char *conv)
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4221 {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4222 code_save_stacks();
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4223 clear_ptr_cache();
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4224 extern_define(conv,0,FUNCTION,1);
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4225 printf("\tbl L_%s$stub\n",conv);
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4226 }
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4227
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4228 #if FLOAT_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4229 #if 0
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4230 static int d2ll_lib_used=0;
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4231 static char *d2ll_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4232 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4233
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4234 static int d2ull_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4235 static char *d2ull_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4236 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4237
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4238 static int f2ll_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4239 static char *f2ll_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4240 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4241
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4242 static int f2ull_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4243 static char *f2ull_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4244 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4245
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4246 static int ll2d_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4247 static char *ll2d_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4248 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4249
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4250 static int ll2f_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4251 static char *ll2f_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4252 };
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4253 #endif
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4254
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4255 #endif
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4256
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4257 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4258 code_asld_lib(int reg,int oreg)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4259 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4260 code_save_stacks();
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4261 clear_ptr_cache();
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4262 asld_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4263 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4264 set_lreg(RET_LREGISTER,0);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4265 if (regv_l(oreg)!=5) {
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4266 printf("\tmr r5,%s\n", lregister_name_low(oreg));
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4267 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4268 printf("\tbl asld__\n");
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4269 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4270
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4271 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4272 code_asrd_lib(int reg,int oreg) // ___ashrdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4273 {
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4274 code_save_stacks();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4275 clear_ptr_cache();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4276 asrd_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4277 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4278 set_lreg(RET_LREGISTER,0);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4279 if (regv_l(oreg)!=5) {
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4280 printf("\tmr r5,%s\n", lregister_name_low(oreg));
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4281 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4282 printf("\tbl asrd__\n");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4283 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4284
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4285 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4286 code_lsrd_lib(int reg,int oreg) // ___lshrdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4287 {
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4288 code_save_stacks();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4289 clear_ptr_cache();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4290 lsrd_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4291 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4292 set_lreg(RET_LREGISTER,0);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4293 if (regv_l(oreg)!=5) {
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4294 printf("\tmr r5,%s\n", lregister_name_low(oreg));
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4295 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4296 printf("\tbl lsrd__\n");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4297 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4298
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4299 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4300 code_ldiv_lib(int reg,int oreg) // ___divdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4301 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4302 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4303 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4304 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4305 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4306 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4307 extern_conv("__divdi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4308 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4309
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4310 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4311 code_ludiv_lib(int reg,int oreg) // ___udivdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4312 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4313 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4314 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4315 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4316 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4317 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4318 extern_conv("__udivdi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4319 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4320
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4321 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4322 code_lmod_lib(int reg,int oreg) // ___moddi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4323 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4324 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4325 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4326 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4327 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4328 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4329 extern_conv("__moddi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4330 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4331
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4332 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4333 code_lumod_lib(int reg,int oreg) // ___umoddi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4334 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4335 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4336 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4337 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4338 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4339 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4340 extern_conv("__umoddi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4341 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4342
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4343 #define check_lreg(reg) if (reg!=lreg) { lmove(reg,lreg); }
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4344
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4345 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4346 ltosop(int op,int reg,int oreg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4347 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4348 int dx = -1;
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4349 int ox = -1;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4350 char *orn_h,*crn_h,*drn_h;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4351 char *orn_l,*crn_l,*drn_l;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4352 // creg = creg op oreg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4353
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4354 use_longlong(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4355 if(oreg==-1) {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4356 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4357 } else if (oreg<= -REG_LVAR_OFFSET) {
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4358 ox = get_lregister(); if (ox<0) error(-1);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4359 use_reg(ox);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4360 code_lrlvar(oreg+REG_LVAR_OFFSET,ox);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4361 oreg = ox;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4362 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4363
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4364 switch(op) {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4365 case LLSHIFT:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4366 case LULSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4367 code_asld_lib(reg,oreg); // ___ashldi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4368 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4369 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4370 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4371 case LRSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4372 code_asrd_lib(reg,oreg); // ___ashrdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4373 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4374 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4375 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4376 case LURSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4377 code_lsrd_lib(reg,oreg); // ___lshrdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4378 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4379 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4380 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4381 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4382 orn_h = lregister_name_high(oreg);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4383 orn_l = lregister_name_low(oreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4384 crn_h = lregister_name_high(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4385 crn_l = lregister_name_low(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4386 switch(op) {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4387 case LADD:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4388 printf("\taddc %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4389 printf("\tadde %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4390 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4391 case LSUB:
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4392 printf("\tsubfc %s,%s,%s\n",crn_l,orn_l,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4393 printf("\tsubfe %s,%s,%s\n",crn_h,orn_h,crn_h);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4394 break;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4395 case LCMP:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4396 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4397 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4398 case LBAND:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4399 printf("\tand %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4400 printf("\tand %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4401 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4402 case LEOR:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4403 printf("\txor %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4404 printf("\txor %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4405 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4406 case LBOR:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4407 printf("\tor %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4408 printf("\tor %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4409 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4410 case LMUL:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4411 case LUMUL:
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4412 // code_save_stacks();
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4413 // clear_ptr_cache();
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4414 dx=get_lregister();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4415 use_reg(dx);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4416 drn_l = lregister_name_low(dx);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4417 drn_h = lregister_name_high(dx);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4418 /*
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4419 drn_l = l32( crn_l * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4420 drn_h = h32( crn_l * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4421 orn_l = l32( crn_h * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4422 drn_h = drn_h + orn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4423 crn_l = l32( crn_l * orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4424 crn_h = drn_h + crn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4425 crn_l = drn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4426 */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4427 printf("\tmulhwu %s,%s,%s\n",drn_h,crn_l,orn_l);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4428 printf("\tmullw %s,%s,%s\n", drn_l,crn_l,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4429 printf("\tmullw %s,%s,%s\n", orn_l,crn_h,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4430 printf("\tadd %s,%s,%s\n", drn_h,drn_h,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4431 printf("\tmullw %s,%s,%s\n", crn_l,orn_h,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4432 printf("\tadd %s,%s,%s\n", crn_h,drn_h,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4433 printf("\tmr %s,%s\n", crn_l,drn_l);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4434 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4435 case LDIV:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4436 code_ldiv_lib(reg,oreg); // ___divdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4437 check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4438 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4439 case LUDIV:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4440 code_ludiv_lib(reg,oreg); // ___udivdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4441 check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4442 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4443 case LMOD:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4444 code_lmod_lib(reg,oreg); // ___moddi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4445 check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4446 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4447 case LUMOD:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4448 code_lumod_lib(reg,oreg); // ___umoddi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4449 check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4450 break;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4451 default:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4452 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4453 }
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4454 if(ox!=-1) free_register(dx);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4455 if(dx!=-1) free_register(dx);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4456 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4457
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4458 int
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4459 code_lconst_op_p(int op,int e)
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4460 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4461 int v;
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4462 if (car(e)==LCONST) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4463 if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0;
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4464 v = lcadr(e);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4465 } else if (car(e)==CONST) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4466 if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0;
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4467 v = cadr(e);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4468 } else return 0;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4469
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4470 switch(op) {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4471 case LLSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4472 case LULSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4473 case LRSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4474 case LURSHIFT:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4475 return (0<v&&v<31);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4476 case LADD:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4477 case LSUB:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4478 return 1;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4479 case LBOR:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4480 return (v>0);
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4481 default:
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4482 return 0;
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4483 }
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4484 }
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4485
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4486 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4487 loprtc(int op,int creg,int e)
213
kono
parents: 212
diff changeset
4488 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4489 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4490 char *crn_l;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4491 char *grn;
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4492 int v;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4493 int greg;
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4494
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4495 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4496 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4497 crn_l = lregister_name_low(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4498
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4499 if (car(e)==LCONST) v = lcadr(e);
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4500 else if (car(e)==CONST) v = cadr(e);
213
kono
parents: 212
diff changeset
4501
kono
parents: 212
diff changeset
4502 switch(op) {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4503 case LLSHIFT:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4504 case LULSHIFT:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4505 greg = get_register();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4506 use_reg(greg);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4507 grn = register_name(greg);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4508 printf("\tsrwi %s,%s,%d\n",grn,crn_l,32-v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4509 printf("\tslwi %s,%s,%d\n",crn_h,crn_h,v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4510 printf("\tor %s,%s,%s\n",crn_h,grn,crn_h);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4511 printf("\tslwi %s,%s,%d\n",crn_l,crn_l,v);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4512 free_register(greg);
213
kono
parents: 212
diff changeset
4513 return;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4514 case LRSHIFT:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4515 greg = get_register();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4516 use_reg(greg);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4517 grn = register_name(greg);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4518 printf("\tsrwi %s,%s,%d\n",grn,crn_l,v);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4519 printf("\tinsrwi %s,%s,%d,0\n",grn,crn_h,v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4520 printf("\tsrawi %s,%s,%d\n",crn_h,crn_h,v);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4521 printf("\tmr %s,%s\n",crn_l,grn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4522 free_register(greg);
213
kono
parents: 212
diff changeset
4523 return;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4524 case LURSHIFT:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4525 greg = get_register();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4526 use_reg(greg);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4527 grn = register_name(greg);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4528 printf("\tslwi %s,%s,%d\n",grn,crn_h,32-v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4529 printf("\tsrwi %s,%s,%d\n",crn_l,crn_l,v);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4530 printf("\tor %s,%s,%s\n",crn_l,grn,crn_l);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4531 printf("\tsrwi %s,%s,%d\n",crn_h,crn_h,v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4532 free_register(greg);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4533 return;
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4534 case LSUB:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4535 v = -v;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4536 case LADD:
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4537 printf("\taddic %s,%s,%d\n",crn_l,crn_l,v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4538 if (v<0)
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4539 printf("\taddme %s,%s\n",crn_h,crn_h);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4540 else
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4541 printf("\taddze %s,%s\n",crn_h,crn_h);
213
kono
parents: 212
diff changeset
4542 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4543 case LBOR:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4544 printf("\tori %s,%s,lo16(%d)\n",crn_l,crn_l,v);
213
kono
parents: 212
diff changeset
4545 break;
kono
parents: 212
diff changeset
4546 default:
kono
parents: 212
diff changeset
4547 error(-1);
kono
parents: 212
diff changeset
4548 }
kono
parents: 212
diff changeset
4549 }
kono
parents: 212
diff changeset
4550
kono
parents: 212
diff changeset
4551
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4552 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4553 emit_lpop_free(int xreg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4554 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4555 if (xreg>=0)
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4556 free_register(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4557 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4558
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4559 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4560 emit_lpush()
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4561 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4562 int new_reg;
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4563 if (!is_longlong_reg(creg)) error(-1);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4564 if (lreg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4565 new_reg = get_lregister(); /* ���Ф˼���(?) */
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4566 lreg_stack[lreg_sp++] = creg; /* push ���뤫���˥쥸������Ȥ� */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4567 lreg = creg = new_reg;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4568 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4569
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4570 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4571 code_i2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4572 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4573 char *crn,*crn_h,*crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4574 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4575 crn = register_name(reg0 = ireg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4576 use_longlong(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4577 crn_h = lregister_name_high(lreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4578 crn_l = lregister_name_low(lreg);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4579 if (reg0!=regv_l(lreg))
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4580 printf("\tmr %s,%s\n",crn_l,crn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4581 printf("\tsrawi %s,%s,31\n",crn_h,crn_l);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4582 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4583
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4584 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4585 code_i2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4586 {
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4587 code_i2ll(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4588 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4589
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4590 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4591 code_u2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4592 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4593 char *crn,*crn_h,*crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4594 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4595 crn = register_name(reg0 = ireg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4596 use_longlong(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4597 crn_h = lregister_name_high(lreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4598 crn_l = lregister_name_low(lreg);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4599 if (reg0!=regv_l(lreg))
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4600 printf("\tmr %s,%s\n",crn_l,crn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4601 printf("\tli %s,0\n",crn_h);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4602 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4603
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4604 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4605 code_u2ull(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4606 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4607 code_u2ll(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4608 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4609
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4610 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4611 code_ll2i(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4612 {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4613 char *crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4614 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4615 crn_l = lregister_name_low(reg0=lreg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4616 use_int(reg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4617 if (ireg!=regv_l(reg0))
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4618 printf("\tmr %s,%s\n",register_name(ireg),crn_l);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4619 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4620
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4621 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4622 code_ll2u(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4623 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4624 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4625 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4626
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4627 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4628 code_ull2i(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4629 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4630 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4631 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4632
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4633 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4634 code_ull2u(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4635 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4636 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4637 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4638
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4639 #if FLOAT_CODE
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4640
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4641 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4642 code_d2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4643 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4644 // fixdfdi$stub
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4645 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4646 extern_conv("__fixdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4647 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4648 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4649 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4650 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4651
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4652 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4653 code_d2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4654 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4655 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4656 extern_conv("__fixunsdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4657 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4658 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4659 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4660 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4661
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4662 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4663 code_f2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4664 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4665 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4666 extern_conv("__fixdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4667 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4668 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4669 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4670 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4671
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4672 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4673 code_f2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4674 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4675 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4676 extern_conv("__fixsfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4677 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4678 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4679 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4680 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4681
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4682 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4683 code_ll2d(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4684 {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4685 set_lreg(RET_LREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4686 extern_conv("__floatdidf");
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4687 set_freg(RET_FREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4688 if (reg!=USE_CREG&&reg!=RET_FREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4689 use_float(1,reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4690 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4691
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4692
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4693 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4694 code_ll2f(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4695 {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4696 set_lreg(RET_LREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4697 extern_conv("__floatdisf");
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4698 set_freg(RET_FREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4699 if (reg!=USE_CREG&&reg!=RET_FREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4700 use_float(0,reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4701 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4702
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4703 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4704 code_ull2d(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4705 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4706 code_ll2d(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4707 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4708
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4709 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4710 code_ull2f(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4711 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4712 code_ll2f(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4713 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4714
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4715 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4716
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4717 static void
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4718 ladd(int creg,int reg,int dir) // creg=reg+dir
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4719 {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4720 printf("\taddic %s,%s,%d\n",
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4721 lregister_name_low(creg),lregister_name_low(reg), dir);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4722 printf("\tadd%s %s,%s\n", dir>0?"ze":"me",
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4723 lregister_name_high(creg),lregister_name_high(reg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4724 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4725
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4726 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4727 code_lpreinc(int e1,int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4728 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4729 int dreg,xreg;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4730 int dir=caddr(e1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4731 if (car(e2)==LREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4732 use_longlong(reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4733 ladd(cadr(e2),cadr(e2),dir);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4734 if (reg!=cadr(e2)) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4735 lmove(reg,cadr(e2));
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4736 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4737 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4738 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4739 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4740 if(!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4741 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4742 if (reg==USE_CREG) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4743 dreg=get_lregister(); if (!dreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4744 set_lreg(dreg,0); // free old lreg==creg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4745 } else {
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4746 dreg = reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4747 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4748 xreg = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4749 lload(xreg,dreg,0);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4750 ladd(dreg,dreg,dir);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4751 code_lassign(xreg,dreg);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4752 emit_pop_free(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4753 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4754
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4755 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4756 code_lpostinc(int e1,int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4757 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4758 int dreg,nreg,xreg;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4759 int dir=caddr(e1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4760 if (car(e2)==LREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4761 use_longlong(reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4762 if (reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4763 lmove(reg,cadr(e2));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4764 ladd(cadr(e2),cadr(e2),dir);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4765 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4766 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4767 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4768 if(!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4769 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4770 nreg=get_lregister(); if (!nreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4771 if (reg==USE_CREG) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4772 dreg=get_lregister(); if (!dreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4773 set_lreg(dreg,0); // free old lreg==creg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4774 } else {
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4775 dreg = reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4776 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4777 xreg = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4778 lload(xreg,dreg,0);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4779 ladd(nreg,dreg,dir);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4780 code_lassign(xreg,nreg);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4781 emit_pop_free(xreg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4782 free_register(nreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4783 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4784
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4785 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4786 code_lassop(int op,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4787 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4788 int xreg;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4789 int edx,edx0=-1;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4790
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4791 // (*creg) op = pop()
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4792 xreg = emit_lpop(0); /* pop e3 value */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4793 if (!is_int_reg(creg)) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4794 edx = ireg;
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4795 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4796 use_longlong(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4797 if (regv_l(lreg)==edx || regv_h(lreg)==edx) {
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
4798 // this can't happen
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4799 edx0 = get_register(); if(!edx0) error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4800 printf("# lassop\n\tmr %s,%s\n",register_name(edx0),register_name(edx));
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4801 edx = edx0;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4802 }
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4803 lload(edx0=edx,reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4804 ltosop(op,reg,xreg);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4805 use_reg(reg);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4806 edx = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4807 code_lassign(edx,reg);
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4808 if (edx0!=-1)
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4809 free_register(edx0);
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4810 emit_pop_free(edx);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4811 emit_lpop_free(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4812 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4813
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4814 void
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4815 code_register_lassop(int reg,int op) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4816 // reg op = pop()
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4817 int xreg=emit_lpop();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4818 ltosop(op,reg,xreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4819 emit_lpop_free(xreg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4820 }
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4821
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4822
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4823 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4824
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4825 void
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4826 code_save_stacks()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4827 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
4828 int i,reg;
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4829 for(i=0;i<reg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
4830 if ((reg=reg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4831 code_assign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4832 (reg_stack[i]=new_lvar(SIZE_OF_INT)),reg,0);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4833 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
4834 free_register(reg);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4835 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4836 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4837 #if FLOAT_CODE
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4838 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
4839 if ((reg=freg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4840 code_dassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4841 (freg_stack[i]=new_lvar(SIZE_OF_DOUBLE)),reg,1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4842 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
4843 free_register(reg);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4844 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
4845 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4846 #endif
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4847 #if LONGLONG_CODE
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4848 for(i=0;i<lreg_sp;i++) {
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4849 if ((reg=lreg_stack[i])>=0) {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4850 code_lassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4851 (lreg_stack[i]=new_lvar(SIZE_OF_LONGLONG)),reg);
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4852 lreg_stack[i]= lreg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
4853 free_register(reg);
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4854 }
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4855 }
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4856 #endif
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4857 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4858
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4859 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4860 emit_lib(char *p[])
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4861 {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
4862 while(*p) {
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
4863 printf("%s\n",*p++);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4864 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4865 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4866
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4867 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4868 code_closing()
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4869 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4870 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4871 if (d2u_lib_used) emit_lib(d2u_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4872 if (u2d_lib_used) emit_lib(u2d_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4873 if (float_one_lib_used) emit_lib(float_one_lib);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
4874 if (float_zero_lib_used) emit_lib(float_zero_lib);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
4875 if (i2d_lib_used) emit_lib(i2d_lib);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4876 #endif
213
kono
parents: 212
diff changeset
4877 #if LONGLONG_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4878 if (asld_lib_used) emit_lib(asld_lib);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4879 if (lsrd_lib_used) emit_lib(lsrd_lib);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4880 if (asrd_lib_used) emit_lib(asrd_lib);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4881 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4882 if (lumod_lib_used) emit_lib(lumod_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4883 if (lmod_lib_used) emit_lib(lmod_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4884 if (ludiv_lib_used) emit_lib(ludiv_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4885 if (ldiv_lib_used) emit_lib(ldiv_lib);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4886 #endif
213
kono
parents: 212
diff changeset
4887 #if FLOAT_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4888 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4889 if (dl2ll_lib_used) emit_lib(dl2ll_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4890 if (d2ull_lib_used) emit_lib(d2ull_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4891 if (f2ll_lib_used) emit_lib(f2ll_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4892 if (f2ull_lib_used) emit_lib(f2ull_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4893 if (ll2d_lib_used) emit_lib(ll2d_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4894 if (ll2f_lib_used) emit_lib(ll2f_lib);
213
kono
parents: 212
diff changeset
4895 #endif
kono
parents: 212
diff changeset
4896 #endif
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4897 #endif
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
4898 global_table();
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
4899 /* printf("\t.ident \"Micro-C compiled\"\n"); */
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4900 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
4901
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4902 #if CASE_CODE
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4903
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4904 int
382
832e1f6bba82 ARM wrote all code. Check compile error.
kono
parents: 375
diff changeset
4905 code_table_jump_p(int delta) { return 1; }
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4906
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4907 void
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4908 code_table_jump(int l,int csvalue,int delta,int max,int min,int dlabel)
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4909 {
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4910 int t,s,u=-1;
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4911 char *crn = register_name(csvalue); // can be t,s,u
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4912 char *trn = register_name(t=get_register());
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4913 char *srn = register_name(s=get_register());
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4914 char *urn;
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4915
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4916 inc_cmpflag();
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4917 if (min>32767||min<-32765) {
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4918 if (t==csvalue) {
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4919 code_const(min,s);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4920 printf("\tsub\t%s,%s,%s\n",trn,crn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4921 } else {
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4922 code_const(min,t);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4923 printf("\tsub\t%s,%s,%s\n",trn,crn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4924 }
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4925 } else {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4926 printf("\taddi\t%s,%s,lo16(%d)\n",trn,crn,-min);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4927 }
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4928 printf("\tcmplwi cr%d,%s,%d\n",cmpflag,trn,max-min);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4929 printf("\tbgt-\tcr%d,L_%d\n",cmpflag,dlabel);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4930 inc_cmpflag();
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4931 switch(delta) {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4932 case 1: printf("\tslwi %s,%s,2\n",trn,trn); break;
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4933 case 2:
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4934 printf("\tli %s,1\n",srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4935 printf("\tand %s,%s,%s\n",srn,srn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4936 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4937 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4938 printf("\tslwi %s,%s,1\n",trn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4939 break;
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4940 case 4:
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4941 printf("\tli %s,3\n",srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4942 printf("\tand %s,%s,%s\n",srn,srn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4943 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4944 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4945 break;
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4946 default:
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4947 urn = register_name(u=get_register());
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4948 printf("\tli %s,%d\n",srn,delta);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4949 printf("\tdivwu %s,%s,%s\n",urn,trn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4950 printf("\tmullw %s,%s,%s\n",srn,urn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4951 printf("\tsubf %s,%s,%s\n",srn,trn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4952 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4953 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4954 printf("\tslwi %s,%s,2\n",trn,urn);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4955 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4956 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4957 srn,l,code_base);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4958 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4959 srn,l,code_base,srn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4960 printf("\tadd %s,%s,%s\n",trn,srn,trn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4961 printf("\tlwz r0,0(%s)\n",trn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4962 printf("\tadd r0,r0,%s\n",srn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4963 printf("\tmtctr r0\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4964 printf("\tbctr\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4965
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4966 free_register(s);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4967 free_register(t);
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
4968 if (u!=-1) free_register(u);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4969 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4970
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4971 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4972 code_table_open(int l)
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4973 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4974 printf("\t.p2align 2\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4975 fwddef(l);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4976 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4977
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4978 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4979 code_table_value(int label,int table_top)
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4980 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4981 printf("\t.long L_%d-L_%d\n",label,table_top);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4982 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4983
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4984 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4985 code_table_close()
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4986 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4987 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4988
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4989 #endif
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
4990
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
4991 #if ASM_CODE
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
4992
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
4993 /*
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
4994 print an operand
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
4995 */
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
4996
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
4997 static void
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
4998 emit_asm_operand(int rstr)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
4999 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5000 if (car(rstr)==REGISTER) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5001 printf("%s",register_name(cadr(rstr)));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5002 } else if (car(rstr)==CONST) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5003 printf("%d",cadr(rstr));
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5004 } else if (car(rstr)==FNAME) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5005 printf("%s",(char*)cadr(rstr));
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5006 } else if (car(rstr)==STRING) {
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5007 printf("L_%d",cadr(rstr));
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5008 } else {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5009 error(-1);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5010 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5011 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5012
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5013 /*
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5014 prepare asm operands
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5015
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5016 char *constraints sgtring
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
5017 int oeprand expr
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5018 int mode (ASM_INPUT,ASM_OUTPUT)
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5019 int replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5020 int output operands count
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5021 int output operands replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5022
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5023 retrun replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5024 list3( operands, next, clobber )
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5025 0 can be shared in input/output
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5026 1 can't be used in input
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5027 */
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5028
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5029 extern int
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5030 code_asm_operand(char *p,int e1,int mode,int repl,int n,int repl0)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5031 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5032 int r;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5033 int c;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5034 int val;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5035 int clobber = 0;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5036
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5037 printf("# constraint %s\n",p);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5038 if (*p=='=') {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5039 // output register
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5040 p++;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5041 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5042 if (*p=='&') {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5043 // earlyclobber
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5044 p++;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5045 clobber = 1;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5046 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5047 c = *p;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5048 if (c=='r') {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5049 if (mode==ASM_INPUT) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5050 for(;repl0;repl0 = cadr(repl0)) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5051 if (car(car(repl0))==REGISTER && caddr(repl0)==0) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5052 r = cadr(car(repl0));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5053 caddr(repl0) = ASM_USED;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5054 break;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5055 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5056 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5057 r = get_register();
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5058 } else {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5059 r = get_register();
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5060 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5061 repl = list3(list2(REGISTER,r),repl,clobber);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5062 } else if (c=='m') {
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5063 repl = list3(list2(0,0),repl,clobber);
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5064 } else if (c=='i') {
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5065 if (car(e1)==GVAR) {
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5066 e1=list3(FNAME,(int)(((NMTBL *)caddr(e1))->nm),0);
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5067 } else if (car(e1)==FNAME) {
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5068 e1=list3(FNAME,(int)(((NMTBL *)cadr(e1))->nm),0);
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5069 } else if (car(e1)==STRING) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5070 val = emit_string_label();
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5071 ascii((char*)cadr(e1));
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5072 e1=list3(STRING,val,0);
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5073 } else if (car(e1)==CONST) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5074 } else error(-1);
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5075 repl = list3(e1,repl,clobber);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5076 } else if (digit(c)) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5077 val = 0;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5078 do { val = val*10 + c-'0'; } while (digit(c=*p++));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5079 if (val>MAX_ASM_REG) error(-1); // too large register
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5080 if (n-val<0) error(-1);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5081 repl = list3(car(nth(n-val-1,repl0)),repl,clobber);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5082 } else error(-1);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5083 return repl;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5084 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5085
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5086 void
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5087 code_free_asm_operand(int repl)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5088 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5089 for(;repl;repl=cadr(repl)) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5090 if (car(car(repl))==REGISTER)
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5091 free_register(cadr(car(repl)));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5092 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5093 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5094
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5095
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5096 extern void
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5097 code_asm(char *asm_str,int repl)
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5098 {
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5099 int c,i,rstr,val;
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5100 char *p;
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5101 int reg[MAX_ASM_REG];
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5102
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5103 text_mode();
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5104 c = *asm_str;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5105 if (c!='\t'&&c!=' ') printf("\t");
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5106 for(i=0;repl && i<MAX_ASM_REG;i++) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5107 reg[i] = car(repl);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5108 repl = cadr(repl);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5109 }
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5110 p = asm_str;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5111 while((c = *p++)) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5112 if (c=='%') {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5113 c = *p++;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5114 if (!c) { break;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5115 } else if (c=='%') {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5116 printf("%%"); continue;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5117 } else if (!digit(c)) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5118 printf("%%%c",c); continue;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5119 }
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5120 val = 0;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5121 do { val = val*10 + c-'0'; } while (digit(c=*p++)) ;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5122 p--;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5123 if (val>MAX_ASM_REG) error(-1); // too large register
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5124 rstr = reg[val];
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5125 emit_asm_operand(rstr);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5126 } else {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5127 printf("%c",c);
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5128 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5129 }
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5130 printf("\n");
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5131 }
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5132
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5133 #endif
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5134
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5135
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5136 #if BIT_FIELD_CODE
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5137
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5138 /* bit field alignment calcuration */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5139
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5140 static void
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5141 set_bitsz(int type,int *psign,int *pbitsz,int *palign,int *pl)
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5142 {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5143 int sign=0,bitsz;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5144 int align,l=0;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5145 switch(cadr(type)) {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5146 case INT: sign=1; bitsz=32; align=4;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5147 case UNSIGNED: bitsz=32; align=4;break;
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5148 case CHAR: sign=1; bitsz= 8; align=1;break;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5149 case UCHAR: bitsz= 8; align=1;break;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5150 case SHORT: sign=1; bitsz=16; align=2;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5151 case USHORT: sign=1; bitsz=16; align=2;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5152 case LONGLONG: sign=1; bitsz=64; align=4;l=1; break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5153 case ULONGLONG: bitsz=64; align=4;l=1; break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5154 default: error(-1);
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5155 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5156 *psign = sign;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5157 *pbitsz = bitsz;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5158 *palign = align;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5159 *pl = l;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5160 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5161
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5162 /*
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5163 bit field alignment calcuration
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5164 this is architecture depenedent
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5165 */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5166
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5167 extern int
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5168 code_bit_field_disp(int type,int *poffset,int *bfd,int *sz)
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5169 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5170 int sign,bitsz,align;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5171 int i;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5172 int bitpos = *bfd;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5173 int offset = *poffset;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5174 int l;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5175 int bitsize = cadddr(type);
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5176 set_bitsz(type,&sign,&bitsz,&align,&l);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5177
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5178 if (bitsize>bitsz) { error(BTERR); bitsize = i; }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5179
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5180 /* bfd means previous bit field bit offset */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5181 if (bitpos) {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5182 /* previous field is bit field and spaces may remain */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5183 /* calc previsous offset */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5184
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5185 i= offset-(bitpos+7)/8;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5186
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5187 for(l = bitpos;l>0;l -= 8,i++) {
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5188 if ((i & (align-1))==0 && l+bitsize <= bitsz) {
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5189 /* alignment is correct and space remains */
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5190 *poffset=offset=i;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5191 i = l+bitsize;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5192 *bfd = i;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5193 *sz = (i+7)/8;
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5194 // printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",l,bitsize,bitsz,*poffset);
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5195 return l;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5196 }
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5197 }
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5198 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5199
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5200 /* first bit-field */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5201
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5202 if ((i=(offset & (align-1)))) {
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5203 *poffset = (offset += (align-i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5204 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5205 bitpos = 0;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5206 *bfd = bitsize;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5207 *sz = (bitsize+7)/8;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5208
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5209 // printf("# bitpos=%d bitsize=%d bitsz=%d offset=%d\n",bitpos,bitsize,bitsz,*poffset);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5210 return bitpos;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5211 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5212
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5213 /* bit field value */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5214
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5215 /* reg contains container value, result should be in reg */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5216 extern void
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5217 code_bit_field(int type,int bitpos,int reg)
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5218 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5219 int sign,bitsz,l,align;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5220 int bitsize = cadddr(type);
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5221 int i;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5222 set_bitsz(type,&sign,&bitsz,&align,&l);
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5223 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5224 /* this implementation returns -1 for int i:1; */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5225 if (l==1) {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5226 use_longlong(reg);
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5227 /* shift left */
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5228 if (bitpos)
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5229 loprtc(LLSHIFT,reg,list2(CONST,bitpos));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5230 /* shift right */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5231 if ((i=bitsz-bitsize))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5232 loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5233 } else {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5234 use_int(reg);
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5235 /* shift left */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5236 if ((i=bitpos+(32-bitsz)))
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5237 oprtc(LSHIFT,reg,list2(CONST,i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5238 /* shift right */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5239 if ((i=bitsz-bitsize+(32-bitsz)))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5240 oprtc(sign?RSHIFT:URSHIFT,reg,list2(CONST,i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5241 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5242 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5243
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5244 /* bit field replacement */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5245
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5246 static void
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5247 make_mask_and_or(int mask,int tmp,char *trn,char *crn,char *lrn)
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5248 {
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5249 // printf("# mask 0x%08x ~0x%08x\n",mask,~mask);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5250 code_const(~mask,tmp);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5251 printf("\tor %s,%s,%s\n",trn,crn,trn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5252 /* do conjunction */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5253 printf("\tand %s,%s,%s\n",lrn,trn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5254 /* make or-mask */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5255 code_const(mask,tmp);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5256 printf("\tand %s,%s,%s\n",trn,crn,trn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5257 /* do disjunction */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5258 printf("\tor %s,%s,%s\n",crn,trn,lrn);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5259 }
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5260
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5261 extern void
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5262 code_bit_replace(int value,int lvalue,int type,int bitpos)
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5263 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5264 int sign,bitsz,l,align;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5265 int bitsize = cadddr(type);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5266 int mask = 0;
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5267 int tmp = -1;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5268 int i;
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5269 char *crn,*lrn,*trn;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5270 set_bitsz(type,&sign,&bitsz,&align,&l);
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5271 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5272 if (l) {
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5273 use_longlong(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5274 crn = lregister_name_low(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5275 lrn = lregister_name_low(lvalue);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5276 /* shift left */
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5277 if ((i=bitsz-bitsize-bitpos))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5278 loprtc(LLSHIFT,value,list2(CONST,i));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5279 trn = register_name(tmp = get_register());
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5280 if (bitpos+bitsize>=32) {
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5281 /* make and-mask lower */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5282 mask = make_mask(bitpos>=32?bitpos-32:0,bitpos+bitsize-32-1);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5283 make_mask_and_or(mask,tmp,trn,crn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5284 }
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5285 crn = lregister_name_high(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5286 lrn = lregister_name_high(lvalue);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5287 if (bitpos<32) {
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5288 /* make and-mask upper */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5289 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5290 make_mask_and_or(mask,tmp,trn,crn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5291 }
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5292 } else {
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5293 use_int(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5294 crn = register_name(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5295 lrn = register_name(lvalue);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5296 /* shift left */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5297 if ((i=bitsz-bitsize-bitpos))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5298 oprtc(LSHIFT,value,list2(CONST,i));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5299 trn = register_name(tmp = get_register());
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5300 /* make and-mask */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5301 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5302 make_mask_and_or(mask,tmp,trn,crn,lrn);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5303 }
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5304 if (tmp!=-1) free_register(tmp);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5305 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5306
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5307 static void
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5308 make_mask_and_or_const(int mask,char *crn,int c)
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5309 {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5310 char *trn;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5311 int tmp = -1;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5312 // printf("# mask 0x%08x ~0x%08x\n",mask,~mask);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5313 if ((~mask|c)!=-1) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5314 trn = register_name(tmp=get_register());
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5315 code_const((~mask|c),tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5316 /* do conjunction */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5317 printf("\tand %s,%s,%s\n",crn,trn,crn);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5318 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5319 /* make or-mask */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5320 c = mask&c;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5321 if (c!=0) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5322 /* do disjunction */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5323 if (!((mask&c)&0xffff0000)) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5324 printf("\tori %s,%s,lo16(%d)\n",crn,crn,c);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5325 } else {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5326 trn = register_name(tmp=get_register());
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5327 code_const(c,tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5328 printf("\tor %s,%s,%s\n",crn,trn,crn);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5329 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5330 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5331 if (tmp!=-1) free_register(tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5332 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5333
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5334 extern void
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5335 code_bit_replace_const(int value,int lvalue,int type,int bitpos)
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5336 {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5337 int sign,bitsz,l,align;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5338 int bitsize = cadddr(type);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5339 int mask = 0;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5340 int i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5341 int c;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5342 #if LONGLONG_CODE
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5343 long long lc;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5344 #endif
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5345 char *crn;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5346 set_bitsz(type,&sign,&bitsz,&align,&l);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5347 // printf("# %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5348 if (l) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5349 #if LONGLONG_CODE
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5350 use_longlong(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5351 crn = lregister_name_low(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5352 /* shift left */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5353 lc = lcadr(value);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5354 if ((i=bitsz-bitsize-bitpos))
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5355 lc <<= i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5356 if (bitpos+bitsize>=32) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5357 /* make and-mask lower */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5358 mask = make_mask(bitpos>=32?bitpos-32:0,bitpos+bitsize-32-1);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5359 make_mask_and_or_const(mask,crn,(int)lc);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5360 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5361 crn = lregister_name_high(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5362 if (bitpos<32) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5363 /* make and-mask upper */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5364 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5365 make_mask_and_or_const(mask,crn,(int)(lc>>32));
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5366 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5367 #endif
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5368 } else {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5369 use_int(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5370 crn = register_name(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5371 /* shift left */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5372 c = cadr(value);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5373 if ((i=bitsz-bitsize-bitpos))
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5374 c <<= i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5375 /* make and-mask */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5376 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz));
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5377 make_mask_and_or_const(mask,crn,c);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5378 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5379 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5380
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5381 #endif
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5382
89
917947ffeb7c power pc version
kono
parents:
diff changeset
5383 /* end */