annotate mc-code-powerpc.c @ 542:492f06738550

working... (struct init fix)
author kono
date Sun, 01 Jan 2006 18:49:07 +0900 (2006-01-01)
parents a349f9c2aef5
children dbfd6e88e2c3
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/",
469
cf1c2c42b7c8 fix iassop
kono
parents: 468
diff changeset
12 "/usr/lib/gcc/i686-apple-darwin8/4.0.0/include/",
173
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
13 0
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
14 };
3b33c7daae95 *** empty log message ***
kono
parents: 172
diff changeset
15
324
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\
469
cf1c2c42b7c8 fix iassop
kono
parents: 468
diff changeset
22 #define __GNUC__ 1\n\
526
9ff5cd7afe2f *** empty log message ***
kono
parents: 518
diff changeset
23 #define __inline inline\n\
9ff5cd7afe2f *** empty log message ***
kono
parents: 518
diff changeset
24 #define __inline__ inline\n\
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
25 #define __builtin_va_list int\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
26 #define __builtin_va_start(ap,arg) ap=(((int)(&arg))+sizeof(arg))\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
27 #define __builtin_va_arg(ap,type) (*((type *)ap)++)\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
28 #define alloca __builtin_alloca\n\
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
29 ";
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
30
89
917947ffeb7c power pc version
kono
parents:
diff changeset
31 #define TEXT_EMIT_MODE 0
917947ffeb7c power pc version
kono
parents:
diff changeset
32 #define DATA_EMIT_MODE 1
917947ffeb7c power pc version
kono
parents:
diff changeset
33 #define RODATA_EMIT_MODE 2
917947ffeb7c power pc version
kono
parents:
diff changeset
34
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);
444
8bec605d1701 small sized struct
kono
parents: 440
diff changeset
38 static int push_struct(int e4,int t,int arg);
518
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
39 static void ascii(char *s);
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
40
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
41
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
42
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
43 static int creg;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
44
89
917947ffeb7c power pc version
kono
parents:
diff changeset
45 static int output_mode = TEXT_EMIT_MODE;
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
46 int data_alignment = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
47
917947ffeb7c power pc version
kono
parents:
diff changeset
48 static int code_disp_label;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
49 static int code_setup;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
50 static int r1_offset_label;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
51 static int lvar_offset_label;
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
52 static int max_func_arg_label;
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
53
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
54 static int reg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
55 static int freg_save;
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
56
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
57 static int freg,ireg,lreg;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
58
238
d64e9a6a66bd ia32 long long code written.
kono
parents: 237
diff changeset
59 int code_lassop_p = 1;
d64e9a6a66bd ia32 long long code written.
kono
parents: 237
diff changeset
60
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
61 #define SIZE_OF_INT 4
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
62 #define SIZE_OF_SHORT 2
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
63 #define SIZE_OF_FLOAT 4
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
64 #define SIZE_OF_DOUBLE 8
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
65 #define SIZE_OF_LONGLONG 8
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
66 #define ENDIAN 1
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
67 #define ENDIAN_L 1
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
68 #define ENDIAN_D 1
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
69
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
70 static int reg_sp; /* REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
71 static int reg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
72
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
73 /* floating point registers */
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
74
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
75 static int freg_sp; /* floating point REGister Stack-Pointer */
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
76 static int freg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
77
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
78 static int lreg_sp; /* longlong REGister Stack-Pointer */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
79 static int lreg_stack[MAX_MAX]; /* �ºݤΥ쥸�������ΰ� */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
80
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
81 #define REG_fp 1
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
82 #define REG_sp 30
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
83 #define REG_VAR_BASE 29
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
84 #define REG_VAR_MIN 18
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
85 #define MIN_TMP_REG 3
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
86 #define MAX_TMP_REG 11
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
87
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
88 #define PTRC_REG 3
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
89
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
90 #define FREG_VAR_BASE 31
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
91 #define FREG_VAR_MIN 20
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
92 #define MIN_TMP_FREG 1
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
93 #define MAX_TMP_FREG 14
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
94
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
95 int MAX_REGISTER=30; /* PowerPC�Υ쥸������10�ĤޤǻȤ�*/
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
96 int MAX_FREGISTER=31;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
97 #define REAL_MAX_REGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
98 #define REAL_MAX_FREGISTER 32 /* PowerPC�Υ쥸������32�Ȥ�������*/
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
99 #define REAL_MAX_LREGISTER 16
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
100
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
101 #define FREG_OFFSET REAL_MAX_REGISTER
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
102 #define LREG_OFFSET (REAL_MAX_REGISTER+REAL_MAX_FREGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
103
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
104 #define RET_REGISTER 3
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
105 #define RET_FREGISTER (1+FREG_OFFSET)
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
106 #define RET_LREGISTER_H 3 /* high word */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
107 #define RET_LREGISTER_L 4 /* low word */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
108 #define RET_LREGISTER LREG_OFFSET
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
109
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
110 int MAX_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
111 int MAX_CODE_INPUT_REGISTER_VAR = 11-MIN_TMP_REG;
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
112 int MAX_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
113 int MAX_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
114 int MAX_CODE_INPUT_DREGISTER_VAR = 14-MIN_TMP_FREG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
115 int MAX_CODE_INPUT_FREGISTER_VAR = 14-MIN_TMP_FREG;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
116
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
117 static int powerpc_regs[REAL_MAX_REGISTER+REAL_MAX_FREGISTER+
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
118 REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
119 static int regv_h0[REAL_MAX_LREGISTER];
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
120 static int regv_l0[REAL_MAX_LREGISTER];
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
121 #define regv_h(i) regv_h0[(i)-LREG_OFFSET]
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
122 #define regv_l(i) regv_l0[(i)-LREG_OFFSET]
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
123
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
124 static int *regs = powerpc_regs;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
125
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
126 #define CREG_REGISTER (MAX_TMP_REG)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
127 #define FREG_FREGISTER (MAX_TMP_FREG+FREG_OFFSET)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
128 #define LREG_LREGISTER (MAX_TMP_REG+LREG_OFFSET)
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
129
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
130
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
131 static int max_reg_var, max_freg_var;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
132
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
133 static char *reg_name[] = {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
134 "r0","r1","r2","r3","r4","r5","r6","r7","r8","r9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
135 "r10","r11","r12","r13","r14","r15","r16","r17","r18","r19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
136 "r20","r21","r22","r23","r24","r25","r26","r27","r28","r29",
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
137 "r30","r31",
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
138 "f0","f1","f2","f3","f4","f5","f6","f7","f8","f9",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
139 "f10","f11","f12","f13","f14","f15","f16","f17","f18","f19",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
140 "f20","f21","f22","f23","f24","f25","f26","f27","f28","f29",
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
141 "f30","f31"
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
142 };
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
143
260
9843979a270e mips fix
kono
parents: 259
diff changeset
144 #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
145
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
146 #define register_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
147 #define fregister_name(i) reg_name[i]
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
148 #define lregister_name_low(i) reg_name[regv_l(i)]
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
149 #define lregister_name_high(i) reg_name[regv_h(i)]
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
150
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
151 #define DEBUG_REG 1
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
152 #if DEBUG_REG
467
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
153 char *rn(int i) { return register_name(i); }
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
154 char *fn(int i) { return fregister_name(i); }
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
155 char *lln(int i) { return lregister_name_low(i); }
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
156 char *lhn(int i) { return lregister_name_high(i); }
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
157 int ll(int i) { return regv_l(i); }
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
158 int lh(int i) { return regv_h(i); }
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
159 #endif
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
160
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
161 #define is_int_reg(i) (0<=i&&i<REAL_MAX_REGISTER)
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
162 #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
163 #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
164
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
165 #define use_int(reg) if (reg==USE_CREG) reg=use_int0()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
166 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
167 int use_int0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
168 int i = creg;
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
169 if (!i||!ireg||!is_int_reg(i)) {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
170 if (lreg) { free_register(lreg); lreg = 0; }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
171 if (!ireg) ireg = get_register();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
172 // else if (ireg!=i) free_register(i);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
173 i = ireg;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
174 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
175 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
176 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
177 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
178 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
179
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
180 #if LONGLONG_CODE
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
181 #define use_longlong(reg) if (reg==USE_CREG) reg=use_longlong0()
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
182
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
183 static
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
184 int use_longlong0() {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
185 int i = creg;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
186 if (!is_longlong_reg(i)) {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
187 if (ireg) { free_register(ireg); ireg=0; }
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
188 if (!lreg||!regs[lreg]) lreg = get_lregister();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
189 // else if (lreg!=i) free_register(i);
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
190 i = lreg;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
191 }
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
192 if (!regv_l(i)) regv_l(i) = get_register();
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
193 if (!regv_h(i)) regv_h(i) = get_register();
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
194 if (!regs[i]) regs[i]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
195 if (!regs[regv_l(i)]) regs[regv_l(i)]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
196 if (!regs[regv_h(i)]) regs[regv_h(i)]=USING_REG;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
197 creg = i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
198 return i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
199 }
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
200 #endif
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
201
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
202
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
203 #if FLOAT_CODE
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
204 #define use_float(d,reg) if (reg==USE_CREG) reg=d?use_double0():use_float0()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
205 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
206 int use_float0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
207 int i = creg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
208 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
209 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
210 if (!freg) freg = get_dregister(0);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
211 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
212 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
213 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
214 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
215 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
216 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
217 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
218 static
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
219 int use_double0() {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
220 int i = creg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
221 if (!is_float_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
222 if (lreg) { free_register(lreg); lreg = 0; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
223 if (!freg) freg = get_dregister(1);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
224 else if (freg!=i) free_register(i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
225 i = freg;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
226 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
227 if (!regs[i]) regs[i]=USING_REG;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
228 creg = i;
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
229 return i;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
230 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
231 #endif
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
232
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
233
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
234 #if FLOAT_CODE
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
235 static
348
e77b3a7002ad name table reconfigure compiled. debug start.
kono
parents: 345
diff changeset
236 NMTBL float_zero = {"_float_zero",0,STATIC,FLOAT,0};
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
237 static
348
e77b3a7002ad name table reconfigure compiled. debug start.
kono
parents: 345
diff changeset
238 NMTBL float_one = {"_float_one",0,STATIC,FLOAT,0};
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
239
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
240
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
241 static char * fload(int d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
242 static int code_d1(double d);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
243 static int code_d2(double d);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
244 #endif
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
245 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
246 static int code_l1(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
247 static int code_l2(long long ll);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
248 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
249
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
250 static void code_save_input_registers(int dots);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
251 static void set_ireg(int,int);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
252 static void set_freg(int,int);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
253 static void set_lreg(int,int);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
254 static void jcond(int l, char cond);
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
255 static void register_usage(char *s);
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
256
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
257
153
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
258 static int max_func_args;
33b39002ac58 MIPS continue
kono
parents: 148
diff changeset
259 static int my_func_args;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
260 #define ARG_LVAR_OFFSET 0x10000000
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
261
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
262 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
263
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
264 r0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
265 r3-r10 input register
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
266 r22-r29 saved register variable (input register for code segment)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
267 r30 stack pointer
917947ffeb7c power pc version
kono
parents:
diff changeset
268 r31 0
917947ffeb7c power pc version
kono
parents:
diff changeset
269 r1 frame pointer
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
270
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
271 f0 return value etc.
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
272 f1-r8 input register
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
273 f24-f31 saved register variable
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
274
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
275 function call stack frame
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
276 <-------r1_offset------------------------------>
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
277 <------------lvar_offset0------>
449
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
278 <--lvar_offset--> r30(?) r1
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
279 r+ +------------+---+---------------+----------+--------------+----+ -
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
280 callee arg xx register save local caller arg xx
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
281 reg_save disp max_func_args*SIZE_OF_INT
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
282 lvar>0 lvar<0 lvar>0x1000 0000
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
283
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
284 code segment stack frame
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
285
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
286 * goto��ƤӽФ����ؿ���r1 ! r1(goto����r1)
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
287 # * r30 <---r1_offset---------> r1
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
288 r+ +----------+--+----------+----------------+-----------+----------+----+
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
289 cousin arg xx reg save !callee arg !code local caller arg xx
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
290 r20-r29 lvar>0 lvar<0 lvar>0x1000 000
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
291 f20-f31 <-my_func_args--><--disp-----><-max_func_arg->
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
292 *SIZE_OF_INT *SIZE_OF_INT
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
293
89
917947ffeb7c power pc version
kono
parents:
diff changeset
294 */
449
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
295 static int arg_offset = 24;
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
296 static int arg_offset1 = 24;
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
297 int disp_offset = -12;
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
298 // #define func_disp_offset 60
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
299 #define func_disp_offset 68
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
300 #define r1_offset func_disp_offset+12
449
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
301 static int code_disp_offset = 0;
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
302 // static int jump_offset = 0;
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
303
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
304 #define CODE_LVAR l+code_disp_offset
129
948977254fa6 fix long argument call in code segement
kono
parents: 128
diff changeset
305 #define CODE_CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
306 #define FUNC_LVAR l+disp_offset
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
307 #define CALLER_ARG (l-ARG_LVAR_OFFSET)+arg_offset1
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
308 #define CALLEE_ARG l+arg_offset
89
917947ffeb7c power pc version
kono
parents:
diff changeset
309
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
310 void
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
311 code_offset_set()
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
312 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
313 #if 0
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
314 int l;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
315 #endif
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
316 int lvar_offsetv = -disp+max_func_args*SIZE_OF_INT+func_disp_offset;
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
317 // int r1_offsetv = -disp+max_func_args*SIZE_OF_INT-reg_save+r1_offset;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
318 int r1_offsetv = lvar_offsetv-reg_save+12;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
319 printf(".set L_%d,%d\n",lvar_offset_label,r1_offsetv-lvar_offsetv);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
320 printf(".set L_%d,%d\n",r1_offset_label,r1_offsetv);
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
321 if (max_func_arg_label) {
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
322 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
323 max_func_arg_label = 0;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
324 }
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
325
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
326 #if 0
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
327 printf("## reg_save %d\n",reg_save);
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
328 printf("## function %s\n",fnptr->nm);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
329 l = ARG_LVAR_OFFSET;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
330 printf("## offset call0\t%d\n",CALLER_ARG);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
331 l = ARG_LVAR_OFFSET+max_func_args*SIZE_OF_INT;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
332 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
333 l = disp;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
334 printf("## offset lvarn\t%d %d\n",FUNC_LVAR+lvar_offsetv,disp);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
335 l = 0;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
336 printf("## offset lvar0\t%d\n",FUNC_LVAR+lvar_offsetv);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
337 l = -reg_save;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
338 printf("## offset regs\t%d\n",FUNC_LVAR+lvar_offsetv);
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
339 printf("## offset r1off\t%d\n",r1_offsetv);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
340 l = 0;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
341 printf("## offset carg0\t%d\n",CALLEE_ARG+r1_offsetv);
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
342 l = my_func_args;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
343 printf("## offset cargn\t%d %d\n",CALLEE_ARG+r1_offsetv,my_func_args);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
344 #endif
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
345 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
346
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
347 static int large_offset_reg;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
348
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
349 static void
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
350 lvar(int l)
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
351 {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
352 char *rn;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
353 if (!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)(r1)\n",CODE_CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
357 } else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
358 printf("lo16(%d)(r30)\n",CODE_LVAR);
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)(r30)\n",FUNC_LVAR);
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)(r1)\n",CALLER_ARG);
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)(r30)\n",CALLEE_ARG,lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
365 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
366 } else {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
367 rn = register_name(large_offset_reg);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
368 if (fnptr->sc==CODE) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
369 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
370 printf("lo16(%d)(%s)\n",CODE_CALLER_ARG,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
371 } else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
372 printf("lo16(%d)(%s)\n",CODE_LVAR,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
373 } else if (l<0) { /* local variable */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
374 printf("lo16(%d)(%s)\n",FUNC_LVAR,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
375 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
376 printf("lo16(%d)(%s)\n",CALLER_ARG,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
377 } else { /* callee's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
378 printf("lo16(%d+L_%d)(%s)\n",CALLEE_ARG,lvar_offset_label,rn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
379 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
380 free_register(large_offset_reg);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
381 }
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
382 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
383
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
384 /* if size of local variables / input variables is more then 64k,
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
385 lo16 does not work. We have to use ha16 also. But we can't know
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
386 the exact size in one path compile. We may safely use lvar16ha
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
387 if disp or max_func_args > 32k. Of course this is redundant for
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
388 smaller offset. But who cares who use very large local variables?
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
389 */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
390
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
391 #define LARGE_OFFSET(l) (l<-32000||l>32000)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
392
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
393 static void
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
394 lvar_intro(int l)
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
395 {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
396 char *rn;
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
397 large_offset_reg=0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
398 if (fnptr->sc==CODE) {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
399 if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
400 if (LARGE_OFFSET(CODE_CALLER_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
401 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
402 printf("\taddis %s,r1,ha16(%d)\n",rn,CODE_CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
403 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
404 } else {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
405 if (LARGE_OFFSET(CODE_LVAR)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
406 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
407 printf("\taddis %s,r30,ha16(%d)\n",rn,CODE_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
408 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
409 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
410 } else if (l<0) { /* local variable */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
411 if (LARGE_OFFSET(FUNC_LVAR)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
412 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
413 printf("\taddis %s,r30,ha16(%d)\n",rn,FUNC_LVAR);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
414 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
415 } else if (l>=ARG_LVAR_OFFSET) { /* caller's arguments */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
416 if (LARGE_OFFSET(CALLER_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
417 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
418 printf("\taddis %s,r1,ha16(%d)\n",rn,CALLER_ARG);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
419 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
420 } else { /* callee's arguments */
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
421 if (LARGE_OFFSET(CALLEE_ARG)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
422 rn=register_name(large_offset_reg=get_register());
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
423 printf("\taddis %s,r30,lo16(%d+L_%d)\n",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
424 rn,CALLEE_ARG,lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
425 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
426 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
427 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
428
917947ffeb7c power pc version
kono
parents:
diff changeset
429
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
430 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
431 code_lvar(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
432 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
433 lvar_intro(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
434 printf("\tla %s,",register_name(reg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
435 lvar(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
436 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
437
89
917947ffeb7c power pc version
kono
parents:
diff changeset
438 void
917947ffeb7c power pc version
kono
parents:
diff changeset
439 code_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
440 {
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
441 /* called only once */
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
442
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
443 init_src = init_src0;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
444 size_of_int = SIZE_OF_INT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
445 size_of_short = SIZE_OF_SHORT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
446 size_of_float = SIZE_OF_FLOAT;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
447 size_of_double = SIZE_OF_DOUBLE;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
448 size_of_longlong = SIZE_OF_LONGLONG;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
449 endian = ENDIAN;
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
450
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
451 regv_l(RET_LREGISTER) = RET_LREGISTER_L;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
452 regv_h(RET_LREGISTER) = RET_LREGISTER_H;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
453 }
917947ffeb7c power pc version
kono
parents:
diff changeset
454
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
455 extern void
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
456 emit_reinit()
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
457 {
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
458 /* called for each file */
328
7ecb023d29b8 macro/codegen reorganization done.
kono
parents: 327
diff changeset
459 /* heap is initialized here, setup ptr cache free list */
7ecb023d29b8 macro/codegen reorganization done.
kono
parents: 327
diff changeset
460 init_ptr_cache();
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
461 }
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
462
89
917947ffeb7c power pc version
kono
parents:
diff changeset
463 void
917947ffeb7c power pc version
kono
parents:
diff changeset
464 gexpr_code_init(void){
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
465 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
466
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
467 void
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
468 code_gexpr(int e){
529
ad874ef77dde use_input_reg...
kono
parents: 528
diff changeset
469 if (is_int_reg(creg) && creg!=ireg) error(-1);
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
470 // register_usage("code_gexpr");
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
471 }
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
472
89
917947ffeb7c power pc version
kono
parents:
diff changeset
473
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
474 void
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
475 code_arg_register(NMTBL *fnptr)
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
476 {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
477 int args = fnptr->dsp;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
478 NMTBL *n;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
479 int reg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
480 int freg_var = 0;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
481 int type;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
482 int reg;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
483 int i;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
484 int is_code0 = is_code(fnptr);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
485 int dots;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
486
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
487 function_type(fnptr->ty,&dots);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
488 while (args) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
489 /* process in reverse order */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
490 n = (NMTBL*)caddr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
491 type = n->ty;
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
492 if (scalar(type)) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
493 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
494 n->sc = REGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
495 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
496 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
497 reg_var++;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
498 cadddr(args)=SIZE_OF_INT;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
499 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
500 } else if (type==FLOAT) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
501 if ((reg = get_input_dregister_var(freg_var,n,is_code0,0))) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
502 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
503 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
504 regs[n->dsp]= INPUT_REG;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
505 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
506 cadddr(args)=size(type);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
507 }
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
508 } else if (type==DOUBLE) {
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
509 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
510 n->sc = DREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
511 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
512 regs[n->dsp]= INPUT_REG;
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
513 freg_var++;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
514 cadddr(args)=size(type);
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
515 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
516 } else if (type==LONGLONG||type==ULONGLONG) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
517 if ((reg = get_input_lregister_var(reg_var,n,is_code0))) {
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
518 n->sc = LREGISTER;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
519 n->dsp = cadr(reg);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
520 regs[i=n->dsp]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
521 regs[regv_l(i)]= INPUT_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
522 regs[regv_h(i)]= INPUT_REG;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
523 reg_var+=2;
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
524 cadddr(args)=size(type);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
525 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
526 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
527 args = cadr(args);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
528 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
529 if (is_function(fnptr))
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
530 code_save_input_registers(dots);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
531 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
532
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
533
89
917947ffeb7c power pc version
kono
parents:
diff changeset
534 int
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
535 get_register(void)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
536 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
537 int i,j,reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
538 for(i=MAX_TMP_REG;i>MIN_TMP_REG;i--) {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
539 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
540 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
541 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
542 }
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
543 /* PTR_CACHE ��Ĥ֤� */
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
544 if ((i=last_ptr_cache())) {
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
545 clear_ptr_cache_reg(i);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
546 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
547 return i; /* ���ξ���ɽ���ֹ���֤� */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
548 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
549 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
550 for(i=0;i<reg_sp;i++) {
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
551 if ((reg=reg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
552 code_assign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
553 (j=new_lvar(SIZE_OF_INT)),reg,0);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
554 reg_stack[i]= j-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
555 return reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
556 }
917947ffeb7c power pc version
kono
parents:
diff changeset
557 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
558 #if LONGLONG_CODE
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
559 /* search register stack */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
560 for(i=0;i<lreg_sp;i++) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
561 if ((reg=lreg_stack[i])>=0) {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
562 code_lassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
563 (j=new_lvar(SIZE_OF_LONGLONG)),reg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
564 lreg_stack[i]= j-REG_LVAR_OFFSET;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
565 free_register(reg);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
566 return get_register();
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
567 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
568 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
569 #endif
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
570 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
571 reg =REG_VAR_BASE-i;
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
572 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
573 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
574 if (i>max_reg_var) max_reg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
575 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
576 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
577 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
578 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
528
d6fff671793a minor fix inline
kono
parents: 527
diff changeset
579 error(RGERR); return creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
580 }
917947ffeb7c power pc version
kono
parents:
diff changeset
581
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
582 #if 0
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
583 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
584 get_register(void)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
585 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
586 int i = get_register0();
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
587 printf("## get_register %d\n",i);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
588 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
589 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
590 #endif
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
591
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
592 int
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
593 pop_register(void)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
594 { /* �쥸���������ͤ���Ф� */
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
595 return reg_stack[--reg_sp];
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
596 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
597
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
598 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
599 int
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
600 get_dregister(int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
601 { /* �Ȥ��Ƥ��ʤ��쥸������Ĵ�٤� */
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
602 int i,reg;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
603 for(i=MAX_TMP_FREG+FREG_OFFSET;i>MIN_TMP_FREG+FREG_OFFSET;i--) {
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
604 if (regs[i]) continue; /* �Ȥ��Ƥ��� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
605 regs[i]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
606 return i; /* ���ξ���ɽ���ֹ���֤� */
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
607 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
608 /* search register stack */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
609 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
610 if ((reg=freg_stack[i])>=0) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
611 code_dassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
612 (freg_stack[i]=new_lvar(SIZE_OF_DOUBLE)),reg,1);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
613 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
614 return reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
615 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
616 }
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
617 for(i=0;i<FREG_VAR_BASE-REG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
618 reg =FREG_VAR_BASE-i+FREG_OFFSET;
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
619 if (! regs[reg]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
620 regs[reg]=USING_REG; /* ���Υ쥸������Ȥ����Ȥ������ */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
621 if (i>max_freg_var) max_freg_var=i;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
622 return reg; /* ���ξ���ɽ���ֹ���֤� */
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
623 }
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
624 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
625 /* �����Ƥ����꤬�ʤ��ʤ顢���顼 (���ä���ï���ȤäƤ��?) */
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
626 error(REG_ERR); return freg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
627 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
628
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
629 #if 0
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
630 int
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
631 get_dregister(int d)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
632 {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
633 int i = get_dregister0(d);
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
634 printf("## get_dregister %d\n",i);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
635 return i;
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
636 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
637 #endif
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
638
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
639 int
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
640 pop_fregister(void)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
641 { /* �쥸���������ͤ���Ф� */
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
642 return freg_stack[--freg_sp];
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
643 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
644 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
645
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
646
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
647 int
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
648 get_lregister0()
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
649 {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
650 int i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
651 for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
652 if (regs[i]==0) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
653 return i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
654 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
655 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
656 return -1;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
657 }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
658
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
659 static int
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
660 get_lregister1(int n,int m)
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
661 {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
662 int i;
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
663 #if 1
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
664 for(i=LREG_OFFSET;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
665 if (regv_l(i)==n && regv_h(i)==m) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
666 return i;
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
667 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
668 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
669 #endif
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
670 return get_lregister0();
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
671 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
672
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
673
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
674 static void
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
675 cleanup_lregister0()
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
676 {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
677 int i;
536
a349f9c2aef5 MIPS set_ireg/lreg interferance
kono
parents: 534
diff changeset
678 // we should not have this, but powerpc's function
a349f9c2aef5 MIPS set_ireg/lreg interferance
kono
parents: 534
diff changeset
679 // lost some input register variables.
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
680 #if 1
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
681 for(i=LREG_OFFSET+1;i<REAL_MAX_LREGISTER+LREG_OFFSET;i++) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
682 if (regs[i]) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
683 if(!regv_l(i) && !regv_h(i)) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
684 regs[i]=0;
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
685 // printf("## cleanup lreg 0 %d\n",i);
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
686 } else if(!regs[regv_l(i)] && !regs[regv_h(i)]) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
687 free_register(i);
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
688 // printf("## cleanup lreg 1 %d\n",i);
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
689 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
690 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
691 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
692 #endif
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
693 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
694
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
695 int
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
696 get_lregister()
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
697 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
698 int h,l,i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
699 i = get_lregister0();
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
700 if (i==-1) return -1;
220
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
701 h = get_register();
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
702 if (h==-1) return -1;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
703 regv_h(i) = h;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
704 l = get_register();
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
705 if (l==-1) { free_register(h); free_register(i); return -1; }
220
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
706 regv_l(i) = l;
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
707 regs[i]=USING_REG;
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
708 // printf("## get_lregister %d %s %s\n",i, lregister_name_high(i), lregister_name_low(i));
220
97246ddfe8ab *** empty log message ***
kono
parents: 219
diff changeset
709 return i;
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
710 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
711
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
712 int
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
713 get_lregister_var(NMTBL *n)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
714 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
715 int i,j,ll;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
716 int max_reg_var_save=max_reg_var;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
717 ll = get_lregister0();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
718 if (ll==-1) goto not_found;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
719 if (regs[ll]==0) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
720 for(i=0;i<REG_VAR_BASE-REG_VAR_MIN;i++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
721 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
722 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
723 regs[REG_VAR_BASE-i]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
724 if (i>max_reg_var) max_reg_var=i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
725 for(j=0;j<REG_VAR_BASE-REG_VAR_MIN;j++) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
726 if (! regs[REG_VAR_BASE-j]) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
727 /* �Ȥ��Ƥ��ʤ��ʤ� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
728 /* ���Υ쥸������Ȥ����Ȥ������ */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
729 regs[REG_VAR_BASE-j]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
730 if (j>max_reg_var) max_reg_var=j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
731 /* ���ξ���ɽ���ֹ���֤� */
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
732 regs[ll]=USING_REG;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
733 regv_l(ll) = REG_VAR_BASE-j;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
734 regv_h(ll) = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
735 return list3(LREGISTER,ll,(int)n);
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
736 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
737 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
738 /* �ҤȤĤ����ʤ��ä� */
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
739 regs[REG_VAR_BASE-i]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
740 max_reg_var=max_reg_var_save;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
741 goto not_found;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
742 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
743 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
744 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
745 not_found:
445
kono
parents: 444
diff changeset
746 return list3(LVAR,new_lvar(SIZE_OF_LONGLONG),0);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
747 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
748
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
749 void
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
750 emit_pop_free(int xreg)
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
751 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
752 if (xreg>=0)
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
753 free_register(xreg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
754 }
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
755
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
756 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
757
89
917947ffeb7c power pc version
kono
parents:
diff changeset
758 free_register(int i) { /* ����ʤ��ʤä��쥸�������� */
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
759 // printf("## free_register %d\n",i);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
760 if (is_longlong_reg(i)) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
761 regs[regv_l(i)]=0;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
762 regs[regv_h(i)]=0;
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
763 //regv_l(i)=0; will erase input register...
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
764 //regv_h(i)=0;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
765 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
766 regs[i]=0;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
767 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
768
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
769 extern void
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
770 use_ptr_cache(int r)
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
771 {
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
772 regs[r]=PTRC_REG;
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
773 }
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
774
89
917947ffeb7c power pc version
kono
parents:
diff changeset
775 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
776 get_input_dregister_var(int i,NMTBL *n,int is_code,int d)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
777 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
778 if (is_code) {
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
779 if(!(i<FREG_VAR_BASE-FREG_VAR_MIN)) return 0;
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
780 i = FREG_VAR_BASE-i+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
781 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
782 if (i<0||i>=MAX_INPUT_DREGISTER_VAR) return 0;
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
783 i = i+MIN_TMP_FREG+FREG_OFFSET;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
784 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
785 return list3(DREGISTER,i,(int)n);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
786 }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
787
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
788 int
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
789 get_input_lregister_var(int i,NMTBL *n,int is_code)
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
790 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
791 int ll;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
792 if (i!=-1) {
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
793 if (is_code) {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
794 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
795 i = REG_VAR_BASE-i;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
796 } else {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
797 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
798 i = i+MIN_TMP_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
799 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
800 ll = get_lregister1(i,i+1);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
801 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
802 regv_l(ll)=i;
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
803 regv_h(ll)=i+1;
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
804 #else
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
805 regv_h(ll)=i;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
806 regv_l(ll)=i+1;
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
807 #endif
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
808 } else { error(-1); ll=LREG_OFFSET+2; }
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
809 return list3(LREGISTER,ll,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
810 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
811
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
812 int
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
813 get_input_register_var(int i,NMTBL *n,int is_code)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
814 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
815 if (is_code) {
131
09379ec2a74b *** empty log message ***
kono
parents: 130
diff changeset
816 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
817 i = REG_VAR_BASE-i;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
818 } else {
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
819 if (i<0||i>=MAX_INPUT_REGISTER_VAR) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
820 i = i+MIN_TMP_REG;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
821 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
822 return list3(REGISTER,i,(int)n);
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
823 }
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
824
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
825 /* double register case? */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
826
135
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
827 int
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
828 get_input_register_var_1(int i,NMTBL *n,int is_code)
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
829 {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
830 if (is_code) {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
831 if(!(i<REG_VAR_BASE-REG_VAR_MIN)) return 0;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
832 i = REG_VAR_BASE-i;
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
833 } else {
4cfd24d1b929 fix power-pc basic test
kono
parents: 134
diff changeset
834 if (i<0||i>=MAX_INPUT_REGISTER_VAR+1) return 0;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
835 i = i+MIN_TMP_REG;
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
836 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
837 return list3(REGISTER,i,(int)n);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
838 }
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
839
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
840 int
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
841 free_register_count(int d)
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
842 {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
843 int i,count,fcount;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
844 fcount = count = 0;
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
845 for(i=0;i<MAX_REGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
846 if (! regs[i]) count++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
847 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
848 for(i=0;i<MAX_FREGISTER;i++) {
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
849 if (! regs[i+FREG_OFFSET]) fcount++;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
850 }
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
851 printf("## free reg %d freg %d\n",count,fcount);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
852 return d?fcount:count;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
853 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
854
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
855 #if 0
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
856 static int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
857 register_full(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
858 {
917947ffeb7c power pc version
kono
parents:
diff changeset
859 int i;
917947ffeb7c power pc version
kono
parents:
diff changeset
860 for(i=0;i<MAX_REGISTER;i++) {
917947ffeb7c power pc version
kono
parents:
diff changeset
861 if (! regs[i]) {
917947ffeb7c power pc version
kono
parents:
diff changeset
862 return 0;
917947ffeb7c power pc version
kono
parents:
diff changeset
863 }
917947ffeb7c power pc version
kono
parents:
diff changeset
864 }
917947ffeb7c power pc version
kono
parents:
diff changeset
865 return 1;
917947ffeb7c power pc version
kono
parents:
diff changeset
866 }
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
867 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
868
917947ffeb7c power pc version
kono
parents:
diff changeset
869 void
917947ffeb7c power pc version
kono
parents:
diff changeset
870 free_all_register(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
871 {
917947ffeb7c power pc version
kono
parents:
diff changeset
872 int i;
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
873 // printf("## free_all register\n");
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
874 #if LONGLONG_CODE
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
875 for(i=0;i<REAL_MAX_LREGISTER;i++) {
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
876 regs[i+LREG_OFFSET]=0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
877 regv_l(i+LREG_OFFSET) = 0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
878 regv_h(i+LREG_OFFSET) = 0;
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
879 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
880 lreg = 0;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
881 // set_lreg(LREG_LREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
882 #endif
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
883 for(i=0;i<MAX_REGISTER;i++) { regs[i]=0; }
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
884 for(i=0;i<MAX_FREGISTER;i++) { regs[i+FREG_OFFSET]=0; }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
885 #if FLOAT_CODE
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
886 freg = get_dregister(1);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
887 set_freg(FREG_FREGISTER,0);
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
888 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
889 ireg = creg = get_register();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
890 set_ireg(CREG_REGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
891 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
892 }
917947ffeb7c power pc version
kono
parents:
diff changeset
893
345
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
894 extern int
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
895 code_register_overlap(int s,int t)
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
896 {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
897 switch(car(s)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
898 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
899 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
900 case DREGISTER: case FREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
901 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
902 if(cadr(s)==cadr(t)) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
903 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
904 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
905 if(cadr(s)==regv_l(cadr(t))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
906 if(cadr(s)==regv_h(cadr(t))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
907 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
908 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
909 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
910 case DREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
911 case FREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
912 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
913 case REGISTER: case LREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
914 case DREGISTER: case FREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
915 if(cadr(s)==cadr(t)) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
916 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
917 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
918 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
919 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
920 switch(car(t)) {
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
921 case DREGISTER: case FREGISTER: break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
922 case REGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
923 if(cadr(t)==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
924 if(cadr(t)==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
925 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
926 case LREGISTER:
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
927 if(regv_l(cadr(t))==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
928 if(regv_l(cadr(t))==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
929 if(regv_h(cadr(t))==regv_l(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
930 if(regv_h(cadr(t))==regv_h(cadr(s))) return 1;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
931 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
932 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
933 break;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
934 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
935 return 0;
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
936 }
2b3946ee4fc9 *** empty log message ***
kono
parents: 341
diff changeset
937
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
938 // int lreg_count;
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
939
89
917947ffeb7c power pc version
kono
parents:
diff changeset
940 void
917947ffeb7c power pc version
kono
parents:
diff changeset
941 register_usage(char *s)
917947ffeb7c power pc version
kono
parents:
diff changeset
942 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
943 #if 1
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
944 int i,j;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
945 #endif
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
946 #define USAGE_MAX 4
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
947 if (!lsrc) return;
467
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
948 printf("## %d: %s:",lineno,s);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
949 if (ireg) printf(" creg=%s",register_name(ireg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
950 if (freg) printf(" freg=%s",fregister_name(freg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
951 if (lreg) printf(" lreg=%s,%s",lregister_name_high(lreg),
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
952 lregister_name_low(lreg));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
953 #if 1
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
954 for(j=0,i=0;i<MAX_REGISTER;i++) if (regs[i]) j++;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
955 if (j>USAGE_MAX) {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
956 printf("\n## regs(%d):",j);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
957 for(i=0;i<MAX_REGISTER;i++) { printf("%d",regs[i]); }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
958 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
959 if (reg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
960 printf(" stack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
961 for(i=reg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
962 if(reg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
963 printf(" %s",register_name(reg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
964 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
965 printf(",%d",reg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
966 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
967 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
968 for(j=0,i=0;i<MAX_FREGISTER;i++) if (regs[i+FREG_OFFSET]) j++;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
969 if (j>USAGE_MAX) {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
970 printf("\n## freg(%d):",j);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
971 for(i=0;i<MAX_FREGISTER;i++) { printf("%d",regs[i+FREG_OFFSET]); }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
972 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
973 if (freg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
974 printf(" fstack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
975 for(i=freg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
976 if(freg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
977 printf(" %s",fregister_name(freg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
978 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
979 printf(",%d",freg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
980 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
981 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
982
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
983 for(j=0,i=0;i<REAL_MAX_LREGISTER;i++) if (regs[i+LREG_OFFSET]) j++;
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
984 // lreg_count = j;
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
985 if (j>USAGE_MAX) {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
986 printf("\n## lreg(%d):",j);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
987 for(i=0;i<REAL_MAX_LREGISTER;i++) { printf("%d",regs[i+LREG_OFFSET]); }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
988 #if 0
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
989 for(i=0;i<REAL_MAX_LREGISTER;i++) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
990 if (regs[i+LREG_OFFSET] && regv_l(i+LREG_OFFSET))
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
991 printf(" %s-%s", lregister_name_high(i+LREG_OFFSET),lregister_name_low(i+LREG_OFFSET));
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
992 else if (regv_l(i+LREG_OFFSET))
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
993 printf(" *%s-%s", lregister_name_high(i+LREG_OFFSET),lregister_name_low(i+LREG_OFFSET));
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
994 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
995 #endif
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
996 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
997 if (lreg_sp>0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
998 printf(" lstack ");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
999 for(i=lreg_sp;i>0;i--) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1000 if(lreg_stack[i-1]>=0) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1001 printf(" %s",lregister_name_high(lreg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1002 printf(",%s",lregister_name_low(lreg_stack[i-1]));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1003 } else
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1004 printf(",%d",lreg_stack[i-1]);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1005 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1006 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1007 #endif
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1008 printf("\n");
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1009 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1010
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1011 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1012
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1013 gexpr_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
1014 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1015 while(reg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
1016 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1017 free_register(reg_stack[--reg_sp]);
917947ffeb7c power pc version
kono
parents:
diff changeset
1018 }
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
1019 while(freg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
1020 error(-1);
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
1021 free_register(freg_stack[--freg_sp]);
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
1022 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1023 while(lreg_sp > 0) {
292
6d4231b6f9fe switch statement prepare
kono
parents: 291
diff changeset
1024 error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1025 free_register(lreg_stack[--lreg_sp]);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1026 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1027 use_int0();
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
1028 text_mode(0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1029 gexpr_code_init();
917947ffeb7c power pc version
kono
parents:
diff changeset
1030 register_usage("gexpr_init");
917947ffeb7c power pc version
kono
parents:
diff changeset
1031 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1032
917947ffeb7c power pc version
kono
parents:
diff changeset
1033
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1034 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1035
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1036 emit_init(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
1037 {
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
1038 /* called before each declaration */
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
1039
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1040 free_all_register();
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
1041 max_reg_var=-1; max_freg_var=-1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1042 reg_sp = 0;
123
5f180dc8d84e intel fix.
kono
parents: 122
diff changeset
1043 freg_sp = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1044 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1045
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1046
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1047 int
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1048 get_register_var(NMTBL *n)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1049 {
917947ffeb7c power pc version
kono
parents:
diff changeset
1050 int i;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
1051 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
1052 if (! regs[REG_VAR_BASE-i]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1053 /* ���Υ쥸������Ȥ����Ȥ������ */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1054 regs[REG_VAR_BASE-i]=USING_REG;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1055 if (i>max_reg_var) max_reg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1056 /* ���ξ���ɽ���ֹ���֤� */
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1057 return list3(REGISTER,REG_VAR_BASE-i,(int)n);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
1058 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1059 }
445
kono
parents: 444
diff changeset
1060 return list3(LVAR,new_lvar(SIZE_OF_INT),0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1061 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1062
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1063 int
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
1064 get_dregister_var(NMTBL *n,int d)
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1065 {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
1066 int i;
148
e0eba2993c37 MIPS version (incomplete)
kono
parents: 147
diff changeset
1067 for(i=0;i<FREG_VAR_BASE-FREG_VAR_MIN;i++) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1068 if (! regs[FREG_VAR_BASE-i+FREG_OFFSET]) { /* �Ȥ��Ƥ��ʤ��ʤ� */
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1069 regs[FREG_VAR_BASE-i+FREG_OFFSET]=USING_REG; /*���Υ쥸������Ȥ����Ȥ������*/
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1070 if (i>max_freg_var) max_freg_var=i;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1071 /* ���ξ���ɽ���ֹ���֤� */
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1072 return list3(DREGISTER,
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1073 FREG_VAR_BASE-i+FREG_OFFSET,(int)n);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1074 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1075 }
445
kono
parents: 444
diff changeset
1076 return list3(LVAR,new_lvar(SIZE_OF_DOUBLE),0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1077 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1078
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
1079 int
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1080 emit_push()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1081 {
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
1082 int new_reg,old=creg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1083 if (!is_int_reg(creg)) error(-1);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1084 if (reg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1085 new_reg = get_register(); /* ���Ф˼��� */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1086 reg_stack[reg_sp++] = creg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1087 ireg = creg = new_reg;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
1088 return old;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1089 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1090
917947ffeb7c power pc version
kono
parents:
diff changeset
1091 int
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1092 emit_pop(int type)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1093 {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1094 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1095 xreg=pop_register();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1096 if (xreg<= -REG_LVAR_OFFSET) {
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1097 reg = get_register();
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1098 code_rlvar(REG_LVAR_OFFSET+xreg,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
1099 free_lvar(REG_LVAR_OFFSET+xreg);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
1100 xreg = reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
1101 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1102 return xreg;
917947ffeb7c power pc version
kono
parents:
diff changeset
1103 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1104
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
1105 static int code_base;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1106
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1107 extern void
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1108 code_ptr_cache_def(int r,NMTBL *nptr)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1109 {
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
1110 char *rrn = register_name(r);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1111 if (nptr->sc==STATIC) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1112 printf("\taddis %s,r31,ha16(_%s-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1113 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1114 printf("\tla %s,lo16(_%s-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1115 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1116 } else {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1117 printf("\taddis %s,r31,ha16(L_%s$non_lazy_ptr-L_%d)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1118 rrn,nptr->nm,code_base);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1119 printf("\tlwz %s,lo16(L_%s$non_lazy_ptr-L_%d)(%s)\n",
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1120 rrn,nptr->nm,code_base,rrn);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1121 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1122 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1123
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1124 static char *cload(int sz) { return sz==1?"lbz":sz==SIZE_OF_SHORT?"lhz":"lwz"; }
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1125 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
1126
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1127 static void
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1128 cext(int sign,int sz,int reg)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1129 {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1130 char *crn = register_name(reg);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1131 if (sign) {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1132 if (sz==1)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1133 printf("\textsb %s,%s\n",crn,crn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1134 else if (sz==SIZE_OF_SHORT)
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1135 printf("\textsh %s,%s\n",crn,crn);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1136 } else {
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1137 if (sz==1)
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1138 printf("\trlwinm %s,%s,0,0xff\n",crn,crn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1139 else if (sz==SIZE_OF_SHORT)
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1140 printf("\trlwinm %s,%s,0,0xffff\n",crn,crn);
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1141 }
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1142 }
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1143
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1144
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1145 void
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1146 code_label(int labelno)
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1147 {
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1148 clear_ptr_cache();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1149 printf("L_%d:\n",labelno);
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1150 }
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1151
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1152 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1153 code_add(int reg,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1154 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1155 char *crn = register_name(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1156 char *rrn = register_name(r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1157 if (offset==0) {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1158 if(r!=reg)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1159 printf("\tmr %s,%s\n",crn,rrn);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
1160 } else if (LARGE_OFFSET(offset)) {
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1161 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1162 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1163 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1164 printf("\taddi %s,%s,%d\n",crn,rrn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1165 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1166
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1167 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1168 code_ld(char *ld,int reg,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1169 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1170 char *crn = register_name(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1171 char *rrn = register_name(r);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
1172 if (LARGE_OFFSET(offset)) {
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1173 printf("\tla %s,ha16(%d)(%s)\n",crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1174 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,crn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1175 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1176 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1177 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1178
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1179 static void
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1180 code_ldf(char *ld,char *crn,int offset,int r)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1181 {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1182 char *rrn = register_name(r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1183 int reg;
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1184 char *lrn;
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1185 if (offset<-32768||32767<offset) {
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1186 lrn = register_name(reg = get_register());
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1187 printf("\tla %s,ha16(%d)(%s)\n",lrn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1188 printf("\t%s %s,%s,lo16(%d)\n",ld,crn,lrn,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1189 free_register(reg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1190 } else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1191 printf("\t%s %s,%d(%s)\n",ld,crn,offset,rrn);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1192 }
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1193
92
e7f8515ba882 *** empty log message ***
kono
parents: 91
diff changeset
1194 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1195 code_gvar(int e1,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1196 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1197 code_add(reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1198 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1199 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1200
917947ffeb7c power pc version
kono
parents:
diff changeset
1201 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1202 code_rgvar(int e1,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1203 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1204 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1205 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1206
917947ffeb7c power pc version
kono
parents:
diff changeset
1207 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1208 code_crgvar(int e1,int reg,int sign,int sz){
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1209 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1210 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1211 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1212 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1213
165
kono
parents: 164
diff changeset
1214
kono
parents: 164
diff changeset
1215
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1216 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1217 code_register(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1218 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1219 if (reg!=e2)
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1220 printf("\tmr %s,%s\n",register_name(reg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1221 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1222
353
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1223 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1224 code_i2c(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1225 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1226 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1227 cext(1,1,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1228 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1229
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1230 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1231 code_i2s(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1232 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1233 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1234 cext(1,SIZE_OF_SHORT,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1235 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1236
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1237 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1238 code_u2uc(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1239 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1240 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1241 cext(0,1,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1242 }
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1243
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1244 extern void
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1245 code_u2us(int reg)
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1246 {
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1247 use_int(reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1248 cext(0,SIZE_OF_SHORT,reg);
41ed77cb9c67 name table reogranization, extendable cheap done.
kono
parents: 350
diff changeset
1249 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1250
917947ffeb7c power pc version
kono
parents:
diff changeset
1251 void
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1252 code_rlvar(int e2,int reg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1253 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1254 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1255 printf("\tlwz %s,",register_name(reg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1256 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1257 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1258
917947ffeb7c power pc version
kono
parents:
diff changeset
1259 void
165
kono
parents: 164
diff changeset
1260 code_crlvar(int e2,int reg,int sign,int sz) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1261 use_int(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1262 lvar_intro(e2);
165
kono
parents: 164
diff changeset
1263 printf("\t%s %s,",cload(sz),register_name(reg));
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1264 lvar(e2);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1265 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1266 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1267
917947ffeb7c power pc version
kono
parents:
diff changeset
1268 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1269 code_fname(NMTBL *n,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1270 int r;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1271 use_int(reg);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
1272 r = get_ptr_cache(n);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1273 if(r!=reg)
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1274 printf("\tmr %s,%s\n",register_name(reg),register_name(r));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1275 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1276 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1277
363
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1278 void
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1279 code_label_value(int label,int reg) {
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1280 char *crn;
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1281 use_int(reg);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1282 crn = register_name(reg);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1283 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,label,code_base);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1284 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,label,code_base,crn);
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1285 return;
f3f2b7906d50 label extension
kono
parents: 355
diff changeset
1286 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1287
917947ffeb7c power pc version
kono
parents:
diff changeset
1288 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1289 code_const(int e2,int reg) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1290 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1291 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1292 crn = register_name(reg);
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
1293 // printf("## 0x%08x\n",e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1294 if (-32768<e2&&e2<32768)
917947ffeb7c power pc version
kono
parents:
diff changeset
1295 printf("\tli %s,%d\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1296 else {
917947ffeb7c power pc version
kono
parents:
diff changeset
1297 printf("\tlis %s,ha16(%d)\n",crn,e2);
917947ffeb7c power pc version
kono
parents:
diff changeset
1298 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,e2);
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
917947ffeb7c power pc version
kono
parents:
diff changeset
1302
917947ffeb7c power pc version
kono
parents:
diff changeset
1303 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1304 code_neg(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1305 use_int(creg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
1306 printf("\tneg %s,%s\n", register_name(creg), register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1307 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1308
917947ffeb7c power pc version
kono
parents:
diff changeset
1309
917947ffeb7c power pc version
kono
parents:
diff changeset
1310 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1311 code_not(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1312 use_int(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1313 printf("\tnor %s,%s,%s\n",
917947ffeb7c power pc version
kono
parents:
diff changeset
1314 register_name(creg), register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1315 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1316
917947ffeb7c power pc version
kono
parents:
diff changeset
1317
917947ffeb7c power pc version
kono
parents:
diff changeset
1318 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1319 code_lnot(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1320 use_int(creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1321 printf("\tsubfic r0,%s,0\n", register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1322 printf("\tadde %s,r0,%s\n", register_name(creg),register_name(creg));
917947ffeb7c power pc version
kono
parents:
diff changeset
1323 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1324
917947ffeb7c power pc version
kono
parents:
diff changeset
1325 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1326 code_preinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1327 char *xrn,*drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1328 if (car(e2)==REGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1329 use_int(reg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1330 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1331 register_name(cadr(e2)),register_name(cadr(e2)), dir);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1332 if (cadr(e2)!=reg)
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
1333 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1334 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1335 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1336 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1337 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1338 xrn = register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1339 if (reg==USE_CREG) {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1340 reg=get_register(); if (!reg) error(-1);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1341 drn = register_name(reg);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1342 set_ireg(reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1343 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1344 drn = register_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1345 }
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1346 printf("\t%s %s,0(%s)\n",cload(sz),drn,xrn);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1347 if (use) cext(sign,sz,reg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1348 printf("\taddi %s,%s,%d\n",drn,drn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1349 printf("\t%s %s,0(%s)\n",cstore(sz),drn,xrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1350 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1351
917947ffeb7c power pc version
kono
parents:
diff changeset
1352
917947ffeb7c power pc version
kono
parents:
diff changeset
1353 void
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1354 code_postinc(int e1,int e2,int dir,int sign,int sz,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1355 char *xrn,*crn,*nrn;
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1356 int nreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1357 if (car(e2)==REGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1358 use_int(reg);
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1359 printf("\tmr %s,%s\n",register_name(reg),register_name(cadr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1360 printf("\taddi %s,%s,%d\n",
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1361 register_name(cadr(e2)),register_name(cadr(e2)),dir);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1362 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
1363 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1364 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1365 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1366 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1367 nreg=get_register(); if (!nreg) error(-1);
917947ffeb7c power pc version
kono
parents:
diff changeset
1368 nrn = register_name(nreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1369 if (reg==USE_CREG) {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1370 reg=get_register(); if (!reg) error(-1);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1371 xrn = register_name(reg);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
1372 set_ireg(reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1373 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1374 xrn = register_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1375 }
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1376 printf("\t%s %s,0(%s)\n",cload(sz),xrn,crn);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1377 if (use) cext(sign,sz,reg);
168
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1378 printf("\taddi %s,%s,%d\n",nrn,xrn,dir);
b1297c82e926 cpostinc removal
kono
parents: 167
diff changeset
1379 printf("\t%s %s,0(%s)\n",cstore(sz),nrn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1380 free_register(nreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1381 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1382
917947ffeb7c power pc version
kono
parents:
diff changeset
1383
917947ffeb7c power pc version
kono
parents:
diff changeset
1384 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1385 code_return(int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1386 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1387 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1388 crn = register_name(creg);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1389 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,retcont,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1390 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,retcont,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1391 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1392
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1393 #define R1SAVE 1
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1394
917947ffeb7c power pc version
kono
parents:
diff changeset
1395 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1396 code_environment(int creg) {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
1397 /* save frame pointer */
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1398 use_int(creg);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1399 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1400 printf("\tlwz %s,0(r1)\n",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1401 #else
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1402 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1403 printf("\tla %s,",register_name(creg));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1404 printf("lo16(%d+L_%d)(r30)\n",FUNC_LVAR,lvar_offset_label);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
1405 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1406 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1407
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1408 static int rexpr_bool(int e1,int reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1409
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1410 #if FLOAT_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1411 static int drexpr_bool(int e1,int reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1412 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1413
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1414 #if LONGLONG_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1415 static int lrexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1416 {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1417 return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1418 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1419 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1420
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1421
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1422
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1423 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1424 code_bool(int e1,int reg) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1425 char *xrn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1426 int e2,e3;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1427
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1428 if (rexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1429 #if FLOAT_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1430 else if (drexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1431 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1432 #if LONGLONG_CODE
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1433 else if (lrexpr_bool(e1,reg)) return;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1434 #endif
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
1435
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1436 b_expr(e1,1,e2=fwdlabel(),1); /* including > < ... */
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1437 if (use) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1438 use_int(reg);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1439 xrn = register_name(reg);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1440 printf("\tli %s,0\n",xrn);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1441 jmp(e3=fwdlabel());
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1442 fwddef(e2);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1443 printf("\tli %s,1\n",xrn);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1444 fwddef(e3);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1445 } else {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1446 fwddef(e2);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
1447 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1448 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1449
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1450 #define code_gt(cond) (cond?"gt":"le")
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1451
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1452 #define code_ugt(cond) (cond?"gt":"le")
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1453
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1454 #define code_ge(cond) (cond?"ge":"lt")
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1455
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1456 #define code_uge(cond) (cond?"ge":"lt")
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1457
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
1458 #define code_eq(cond) (cond?"eq":"ne")
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1459
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1460 static int cmpflag = 0;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1461
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1462 static void
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1463 inc_cmpflag()
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1464 {
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1465 cmpflag = (cmpflag+1)%8;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1466 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1467
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1468 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1469 code_cmp_crgvar(int e1,int reg,int sz,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1470 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1471 code_ld(cload(sz),reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
432
f8ebd7e1c644 *** empty log message ***
kono
parents: 431
diff changeset
1472 cext(0,sz,reg);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1473 inc_cmpflag();
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1474 printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(reg));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1475 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1476 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1477
917947ffeb7c power pc version
kono
parents:
diff changeset
1478
917947ffeb7c power pc version
kono
parents:
diff changeset
1479 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1480 code_cmp_crlvar(int e2,int reg, int sz,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1481 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1482 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1483 crn = register_name(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1484 lvar_intro(e2);
167
0197ca125567 mips short
kono
parents: 165
diff changeset
1485 printf("\t%s %s,",cload(sz),crn);
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1486 lvar(e2);
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
1487 cext(0,sz,reg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1488 code_cmp_register(reg,label,cond);
160
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1489 }
1f440a2790fb *** empty log message ***
kono
parents: 156
diff changeset
1490
89
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_rgvar(int e1,int reg,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1494 use_int(reg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
1495 code_ld("lwz",reg,cadr(e1),get_ptr_cache((NMTBL*)caddr(e1)));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1496 code_cmp_register(reg,label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1497 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1498
917947ffeb7c power pc version
kono
parents:
diff changeset
1499
917947ffeb7c power pc version
kono
parents:
diff changeset
1500 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1501 code_cmp_rlvar(int e2,int reg,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1502 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1503 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1504 crn = register_name(reg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1505 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1506 printf("\tlwz %s,",crn);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1507 lvar(e2);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1508 code_cmp_register(reg,label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1509 }
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 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1513 code_cmp_register(int e2,int label,int cond) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1514 use_int(e2);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
1515 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
1516 printf("\tcmpwi cr%d,%s,0\n",cmpflag,register_name(e2));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
1517 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1518 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1519
917947ffeb7c power pc version
kono
parents:
diff changeset
1520
917947ffeb7c power pc version
kono
parents:
diff changeset
1521 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
1522 code_string(int e1,int creg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1523 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1524 int lb;
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1525 char *crn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1526
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1527 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1528 crn = register_name(creg);
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1529 lb = emit_string_label();
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
1530 ascii((char *)cadr(e1));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1531 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1532 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
1533 } else {
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
1534 text_mode(0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1535 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1536 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",crn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
1537 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",crn,lb,code_base,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1538 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1539
917947ffeb7c power pc version
kono
parents:
diff changeset
1540 #define MAX_COPY_LEN 20
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
1541 // #define MAX_COPY_LEN 10
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1542
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
1543 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1544 emit_copy(int from,int to,int length,int offset,int value,int det)
917947ffeb7c power pc version
kono
parents:
diff changeset
1545 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1546 char *frn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1547 char *trn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1548 char *drn;
917947ffeb7c power pc version
kono
parents:
diff changeset
1549 int fix = 0;
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1550 char *memmove = "memmove";
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1551 int dreg = get_register(); if (!dreg) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1552
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1553 drn = register_name(dreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1554 use_int(from);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1555 use_int(to);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1556 frn = register_name(from);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1557 trn = register_name(to);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1558
917947ffeb7c power pc version
kono
parents:
diff changeset
1559 /* length <0 means upward direction copy */
917947ffeb7c power pc version
kono
parents:
diff changeset
1560 switch (length) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1561 case 0: break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1562 case 1: case -1:
917947ffeb7c power pc version
kono
parents:
diff changeset
1563 printf("\tlbz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1564 printf("\tstb %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 case 2: case -2:
917947ffeb7c power pc version
kono
parents:
diff changeset
1567 printf("\tlhz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1568 printf("\tsth %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1569 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1570 case 4: case -4:
917947ffeb7c power pc version
kono
parents:
diff changeset
1571 printf("\tlwz %s,%d(%s)\n",drn,offset,frn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1572 printf("\tstw %s,%d(%s)\n",drn,offset,trn);
917947ffeb7c power pc version
kono
parents:
diff changeset
1573 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1574 default:
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1575 if (length <0) {
416
a6ed0575d731 ARM goto code, Parallel assignment
kono
parents: 415
diff changeset
1576 if (length >= -MAX_COPY_LEN) {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1577 for(;length<=-4;length+=4,offset-=4)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1578 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
1579 for(;length<=-2;length+=2,offset-=2)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1580 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
1581 if(length<0)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1582 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
1583 break;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1584 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1585 } else if (length <=MAX_COPY_LEN) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1586 for(;length>=4;length-=4,offset+=4)
917947ffeb7c power pc version
kono
parents:
diff changeset
1587 emit_copy(from,to,4,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1588 for(;length>=2;length-=2,offset+=2)
917947ffeb7c power pc version
kono
parents:
diff changeset
1589 emit_copy(from,to,2,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1590 if(length>0)
917947ffeb7c power pc version
kono
parents:
diff changeset
1591 emit_copy(from,to,length,offset,0,det);
917947ffeb7c power pc version
kono
parents:
diff changeset
1592 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
1593 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1594 clear_ptr_cache();
e537da31dce3 struct push
kono
parents: 123
diff changeset
1595 code_save_stacks();
416
a6ed0575d731 ARM goto code, Parallel assignment
kono
parents: 415
diff changeset
1596 printf("\tli r5,%d\n",length>0?length:-length);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1597 printf("\tmr r4,%s\n",frn);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1598 printf("\tmr r3,%s\n",trn);
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
1599 /* offset should be ignored */
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1600 /* overrap must be allowed */
e537da31dce3 struct push
kono
parents: 123
diff changeset
1601 printf("\tbl L_%s$stub\n",memmove);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1602 extern_define(memmove,0,FUNCTION,1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1603 fix=0;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1604 set_ireg(RET_REGISTER,0);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1605 if (creg!=to) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1606 free_register(to); to = creg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1607 }
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1608 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1609 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1610 if (value) {
917947ffeb7c power pc version
kono
parents:
diff changeset
1611 /* creg must point top of the destination data */
917947ffeb7c power pc version
kono
parents:
diff changeset
1612 /* this code is necessary for the value of assignment or function call */
917947ffeb7c power pc version
kono
parents:
diff changeset
1613 /* otherwise we don't need this */
917947ffeb7c power pc version
kono
parents:
diff changeset
1614 if (fix) printf("\taddi %s,%s,%d\n",trn,trn,fix);
917947ffeb7c power pc version
kono
parents:
diff changeset
1615 if(creg!=to) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1616 free_register(creg); creg=to; ireg=to;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1617 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1618 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1619 free_register(dreg);
917947ffeb7c power pc version
kono
parents:
diff changeset
1620 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1621
917947ffeb7c power pc version
kono
parents:
diff changeset
1622 int
444
8bec605d1701 small sized struct
kono
parents: 440
diff changeset
1623 push_struct(int e4,int t,int arg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1624 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1625 int length,count;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1626 int dreg,sreg; char *drn,*crn,*srn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1627 g_expr(e4);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
1628 if (!is_int_reg(creg)) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1629 length=size(t);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1630 if(length%SIZE_OF_INT) {
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1631 length += SIZE_OF_INT - (length%SIZE_OF_INT);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1632 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
1633 dreg = get_register(); if (!dreg) error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1634 drn = register_name(dreg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1635 crn = register_name(creg);
125
e537da31dce3 struct push
kono
parents: 123
diff changeset
1636 if (length<MAX_COPY_LEN) {
e537da31dce3 struct push
kono
parents: 123
diff changeset
1637 sreg = get_register(); if (!sreg) error(-1);
e537da31dce3 struct push
kono
parents: 123
diff changeset
1638 srn = register_name(sreg);
258
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 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
1641 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
1642 printf("\tstwu %s,%d(%s)\n",srn,count,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1643 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1644 free_register(sreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1645 free_register(dreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1646 return length/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1647 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1648 code_lvar(cadr(arg),dreg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1649 /* downward direction copy */
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1650 emit_copy(creg,dreg,length,0,0,1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1651 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1652 free_register(dreg);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1653 return length/SIZE_OF_INT;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1654 }
917947ffeb7c power pc version
kono
parents:
diff changeset
1655
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1656 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1657 set_ireg(int reg,int mode)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1658 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1659 if (!is_int_reg(reg)) error(-1);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1660 if (reg!=creg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1661 clear_ptr_cache_reg(reg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1662 if (ireg && reg!=ireg ) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1663 free_register(ireg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1664 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1665 printf("\tmr %s,%s\n",register_name(reg),register_name(ireg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1666 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1667 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1668 free_register(creg);
536
a349f9c2aef5 MIPS set_ireg/lreg interferance
kono
parents: 534
diff changeset
1669 if (creg==lreg) lreg = 0;
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1670 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1671 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1672 creg = ireg = reg;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1673 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1674
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1675 void
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1676 set_freg(int reg,int mode)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1677 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1678 if (!is_float_reg(reg)) error(-1);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1679 if (reg!=creg) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1680 if (freg && reg!=freg) {
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1681 free_register(freg);
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1682 if (mode) {
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1683 printf("\tfmr %s,%s\n",fregister_name(reg),fregister_name(freg));
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1684 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
1685 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1686 // if (creg!=ireg) free_register(creg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1687 regs[reg]=USING_REG;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1688 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1689 creg = freg = reg;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1690 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1691
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1692 void
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1693 set_lreg(int reg,int mode)
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
1694 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1695 if (reg==RET_LREGISTER) {
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1696 regv_l(reg) = RET_LREGISTER_L;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1697 regv_h(reg) = RET_LREGISTER_H;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1698 }
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1699 if (!is_longlong_reg(reg)) error(-1);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1700 if (reg!=creg) {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1701 if (lreg) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1702 if (reg!=lreg) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1703 if (mode) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1704 printf("\tmr %s,%s\n",
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1705 lregister_name_low(reg),lregister_name_low(lreg));
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1706 printf("\tmr %s,%s\n",
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1707 lregister_name_high(reg),lregister_name_high(lreg));
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1708 }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1709 free_register(lreg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1710 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1711 if (lreg==creg) creg=0;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1712 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1713 if (creg) free_register(creg);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1714 regs[reg]=USING_REG;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1715 clear_ptr_cache_reg(regv_l(reg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1716 regs[regv_l(reg)]=USING_REG;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
1717 clear_ptr_cache_reg(regv_h(reg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1718 regs[regv_h(reg)]=USING_REG;
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
1719 creg = lreg = reg;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1720 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1721 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1722
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1723 void
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1724 set_lreg_operand(int reg,int mode)
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1725 {
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
1726 // save_stack,clear_ptr_cache is assumed
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1727 if (!is_longlong_reg(reg)) { error(-1); return; }
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1728 if (mode) {
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1729 if (regv_l(reg)!=3)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1730 printf("\tmr r3,%s\n", lregister_name_high(reg));
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1731 if (regv_l(reg)!=4)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1732 printf("\tmr r4,%s\n", lregister_name_low(reg));
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1733 }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1734 }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1735
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1736 void
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1737 set_lreg_operand1(int reg,int mode)
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1738 {
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
1739 // save_stack,clear_ptr_cache is assumed
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1740 if (!is_longlong_reg(reg)) { error(-1); return; }
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
1741 if (mode) {
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1742 if (regv_l(reg)!=5)
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1743 printf("\tmr r5,%s\n", lregister_name_high(reg));
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1744 if (regv_l(reg)!=6)
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1745 printf("\tmr r6,%s\n", lregister_name_low(reg));
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
1746 }
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1747 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1748
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
1749 void
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1750 use_reg(int arg)
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1751 {
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
1752 // printf("## use reg %d\n",arg);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1753 if (arg<0||arg> REAL_MAX_REGISTER+REAL_MAX_FREGISTER+ REAL_MAX_LREGISTER)
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
1754 error(-1);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1755 clear_ptr_cache_reg(arg);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1756 regs[arg]=USING_REG;
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1757 if (is_longlong_reg(arg)) {
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1758 clear_ptr_cache_reg(regv_l(arg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1759 regs[regv_l(arg)]=USING_REG;
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1760 clear_ptr_cache_reg(regv_h(arg));
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
1761 regs[regv_h(arg)]=USING_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1762 }
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1763 }
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1764
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1765 void
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1766 code_save_input_registers(int dots)
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1767 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1768 int args;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1769 NMTBL *n;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1770 int reg;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1771 int tag;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1772 int lvar;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1773 int t;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1774 /* fnptr->dsp=list4(type,fnptr->dsp,(int)n,0); */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1775 int reg_offset = 0;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1776 int offset = 0;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1777 int reg_var = 0;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1778
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1779 for(args = fnptr->dsp;args;args = cadr(args)) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1780 n = (NMTBL *)caddr(args);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1781 tag = n->sc;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1782 reg = n->dsp;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1783 if (!n||n==&null_nptr) error(REG_ERR);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1784 if (tag==REGISTER) {
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1785 /* regs[reg]==INPUT_REG case should be considered */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1786 n->dsp = offset;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1787 offset+=SIZE_OF_INT;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1788 t = INT;
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1789 reg += reg_offset; /* for duplicated floating point argument */
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1790 reg_var++;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1791 } else if (tag==DREGISTER) {
145
fb61020a9b48 fix macro
kono
parents: 144
diff changeset
1792 /* regs[reg]==INPUT_REG case should be considered */
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1793 n->dsp = offset;
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1794 t = n->ty;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1795 if(t==FLOAT) { offset+=SIZE_OF_FLOAT; reg_offset+=1; }
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1796 else if(t==DOUBLE) { offset+=SIZE_OF_DOUBLE; reg_offset+=2; }
120
099518ea9cc1 input args offset (continue..)
kono
parents: 119
diff changeset
1797 else error(-1);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1798 reg_var += 2;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1799 } else if (tag==LREGISTER) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1800 /* regs[reg]==INPUT_REG case should be considered */
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1801 n->dsp = offset;
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1802 t = n->ty;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1803 offset+=SIZE_OF_LONGLONG; reg_offset+=2;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1804 reg_var += 2;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1805 } else {
534
0f24e1dba811 *** empty log message ***
kono
parents: 531
diff changeset
1806 // n->dsp = offset; this is no allowed becase of arg reorder
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1807 offset += size(n->ty);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1808 continue;
122
b884271bcab2 input registers (long arguments )
kono
parents: 121
diff changeset
1809 }
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1810 n->sc = LVAR;
445
kono
parents: 444
diff changeset
1811 lvar = list3(LVAR,n->dsp,0);
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1812 g_expr_u(assign_expr0(
445
kono
parents: 444
diff changeset
1813 list3(LVAR,n->dsp,0),list3(tag,reg,(int)n),n->ty,t));
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
1814 if (tag==REGISTER||tag==DREGISTER||tag==FREGISTER||tag==LREGISTER) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1815 free_register(reg);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1816 }
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1817 }
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1818 if (dots) {
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1819 while ((reg = get_input_register_var(reg_var,0,0))) {
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1820 g_expr_u(assign_expr0(
445
kono
parents: 444
diff changeset
1821 list3(LVAR,offset,0),reg,INT,INT));
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1822 offset+=SIZE_OF_INT;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1823 reg_var++;
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1824 }
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
1825 }
121
00df510bc116 *** empty log message ***
kono
parents: 120
diff changeset
1826 my_func_args = offset;
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1827 }
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
1828
449
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
1829 int
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
1830 not_simple_p(int e3)
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1831 {
450
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1832 switch (e3) {
456
b8f95294eb77 inline continue... if test passed.
kono
parents: 453
diff changeset
1833 case FUNCTION: case CONV: case LCALL: case STASS:
450
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1834 case LLSHIFT: case LULSHIFT: case LRSHIFT: case LURSHIFT:
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1835 case LDIV: case LUDIV: case LMOD: case LUMOD: case LASSOP: case ALLOCA:
456
b8f95294eb77 inline continue... if test passed.
kono
parents: 453
diff changeset
1836 case INLINE:
450
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1837 return 1;
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1838 }
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
1839 return 0;
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1840 }
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
1841
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1842 static int
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1843 simple_arg(int e3)
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1844 {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1845 return !contains_p(e3,not_simple_p);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1846 }
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1847
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1848 int
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1849 caller_arg_offset_v(int arg)
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1850 {
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
1851 return ARG_LVAR_OFFSET+arg*SIZE_OF_INT;
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1852 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1853
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1854 void
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1855 use_input_reg(int reg,int mode)
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1856 {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1857 if (is_int_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1858 if (ireg&&reg == ireg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1859 if (creg==ireg) creg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1860 ireg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1861 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1862 if (lreg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1863 if (regv_l(lreg)==reg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1864 regs[lreg]=0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1865 if (regv_h(lreg)>reg&&regs[regv_h(lreg)]==USING_REG) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1866 free_register(regv_h(lreg));
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1867 }
529
ad874ef77dde use_input_reg...
kono
parents: 528
diff changeset
1868 if (creg==lreg) creg = ireg;
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
1869 free_register(lreg);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1870 lreg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1871 } else if (regv_h(lreg)==reg) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1872 regs[lreg]=0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1873 if (regv_h(lreg)>reg&&regs[regv_l(lreg)]==USING_REG) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1874 free_register(regv_l(lreg));
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1875 }
529
ad874ef77dde use_input_reg...
kono
parents: 528
diff changeset
1876 if (creg==lreg) creg = ireg;
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
1877 free_register(lreg);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1878 lreg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1879 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1880 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1881 } else if (is_longlong_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1882 use_input_reg(regv_h(reg),0);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1883 use_input_reg(regv_l(reg),0);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1884 } else if (is_float_reg(reg)) {
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1885 if (freg&&reg == freg) {
529
ad874ef77dde use_input_reg...
kono
parents: 528
diff changeset
1886 if (creg==freg) creg = ireg;
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1887 freg = 0;
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1888 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1889 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1890 if (mode) use_reg(reg);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1891 }
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
1892
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
1893 static int
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1894 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
1895 int t=caddr(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1896 int e4 = car(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1897 reg_arg_list = list2(arg,reg_arg_list);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1898 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
1899 if (car(arg)==REGISTER||car(arg)==DREGISTER||
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1900 car(arg)==FREGISTER||car(arg)==LREGISTER)
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1901 use_input_reg(cadr(arg),1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1902 car(e3) = arg;
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
1903 return reg_arg_list;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1904 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1905
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1906 static void
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1907 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
1908 int nargs=0,reg_arg=0,freg_arg=0;
487
b4d9809d6ee2 type attribute (half done)
kono
parents: 475
diff changeset
1909 int t=type_value(caddr(e3));
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1910 if (t>=0&&(car(t)==BIT_FIELD)) {
487
b4d9809d6ee2 type attribute (half done)
kono
parents: 475
diff changeset
1911 t = type_value(cadr(t));
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1912 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1913 if(scalar(t)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1914 nargs ++ ; reg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1915 } else if (t==LONGLONG||t==ULONGLONG) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1916 nargs ++ ; reg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1917 nargs ++ ; reg_arg++;
475
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1918 } else if (t==FLOAT) {
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1919 if (*preg_arg<MAX_INPUT_REGISTER_VAR) {
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1920 reg_arg += 1;
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1921 }
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1922 freg_arg++;
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1923 nargs += size(t)/SIZE_OF_INT;
ec4046c9d34f PowerPC float / int mix args bug fix.
kono
parents: 469
diff changeset
1924 } else if (t==DOUBLE) {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1925 if (*preg_arg<MAX_INPUT_REGISTER_VAR) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1926 reg_arg += 2;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1927 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1928 freg_arg++;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1929 nargs += size(t)/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1930 } 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
1931 nargs += round4(size(t))/SIZE_OF_INT;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1932 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1933 error(TYERR);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1934 nargs ++ ;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1935 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1936 *pnargs += nargs;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1937 *preg_arg += reg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1938 *pfreg_arg += freg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1939 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1940
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1941 #define AS_SAVE 1
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1942 #define AS_ARG 0
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1943
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1944 static int
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1945 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
1946 {
487
b4d9809d6ee2 type attribute (half done)
kono
parents: 475
diff changeset
1947 t = type_value(t);
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1948 if (t>=0&&(car(t)==BIT_FIELD)) {
487
b4d9809d6ee2 type attribute (half done)
kono
parents: 475
diff changeset
1949 t = type_value(cadr(t));
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
1950 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1951 if(scalar(t)) {
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 if (reg_arg>=MAX_INPUT_REGISTER_VAR) {
445
kono
parents: 444
diff changeset
1955 return list3(LVAR,caller_arg_offset_v(nargs),0);
258
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 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
1958 } else if (t==LONGLONG||t==ULONGLONG) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1959 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1960 return get_lregister_var(0);
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
1961 } else if (reg_arg+1>=MAX_INPUT_REGISTER_VAR) {
445
kono
parents: 444
diff changeset
1962 return list3(LVAR,caller_arg_offset_v(nargs),0);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1963 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1964 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
1965 } else if (t==FLOAT) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1966 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1967 return get_dregister_var(0,0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1968 } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
445
kono
parents: 444
diff changeset
1969 return list3(LVAR,caller_arg_offset_v(nargs),0);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1970 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1971 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
1972 } else if (t==DOUBLE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1973 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1974 return get_dregister_var(0,1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1975 } else if (freg_arg>=MAX_INPUT_DREGISTER_VAR) {
445
kono
parents: 444
diff changeset
1976 return list3(LVAR,caller_arg_offset_v(nargs),0);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1977 } else
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1978 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
1979 } 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
1980 if (mode==AS_SAVE) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1981 return get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1982 } else
445
kono
parents: 444
diff changeset
1983 return list3(LVAR,caller_arg_offset_v(nargs),0);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1984 } else {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1985 error(-1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1986 return get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1987 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1988 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
1989
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1990 int
89
917947ffeb7c power pc version
kono
parents:
diff changeset
1991 function(int e1)
917947ffeb7c power pc version
kono
parents:
diff changeset
1992 {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
1993 int e2,e3,e4,e5,nargs,t,r0,r1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
1994 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
1995 int dots;
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
1996 int reg_arg_list=0,ret_type,special_lvar;
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
1997 NMTBL *fn = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1998 int jmp = 0;
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
1999 char *jrn;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2000 int complex_;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2001 int pnargs,preg_arg,pfreg_arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2002 int stargs;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2003
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2004 special_lvar = -1;
305
117baacd1ed0 stdarg powerpc passed except long long (macro problem)
kono
parents: 304
diff changeset
2005 ret_type = function_type(cadddr(e1),&dots);
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2006 if (caddr(cadddr(e1))==0) dots=1;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2007
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2008 arg_assign = 0;
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2009 e2 = cadr(e1);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2010 if (car(e2) == FNAME) {
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2011 fn=(NMTBL *)cadr(e2);
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2012 } else {
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2013 if (car(e2)==INDIRECT) e2=cadr(e2); // (*func)(i) case
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2014 jmp = get_register_var(0);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2015 if (car(jmp)!=REGISTER) error(-1);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2016 reg_arg_list = list2(jmp,reg_arg_list);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2017 if (!simple_arg(e2)) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2018 g_expr_u(assign_expr0(jmp,e2,INT,INT));
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2019 } else
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2020 arg_assign = list2(assign_expr0(jmp,e2,INT,INT),arg_assign);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2021 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2022 /* 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
2023 input variables */
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2024 stargs = 0;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2025 complex_ = 0;
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2026 nargs = reg_arg = freg_arg = 0;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2027 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
2028 t=caddr(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2029 if ((e5= !simple_arg(car(e3)))) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2030 if (complex_) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2031 arg = get_input_arg(caddr(complex_),AS_SAVE,
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2032 pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2033 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
2034 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2035 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
2036 complex_ = e3;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2037 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2038 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
2039 // The struct should be pushed after complex arguments.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2040 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
2041 complex_ = 0;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2042 e4 = car(e3);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2043 if (car(e4)!=RSTRUCT) error(-1);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2044 if (!simple_arg(cadr(e4))) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2045 // Calculate complex struct address here.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2046 // If simple, leave it.
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2047 arg = get_register_var(0);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2048 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
2049 car(e3)=arg;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2050 reg_arg_list = list2(arg,reg_arg_list);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2051 if (car(arg)==REGISTER) use_input_reg(cadr(arg),1);
408
b4375f895fd5 ARM struct copy, alloca fix
kono
parents: 405
diff changeset
2052 else car(e3) = rvalue_t(arg,INT);
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2053 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2054 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2055 stargs = list4(e3,stargs,nargs,reg_arg);
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2056 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2057 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
2058 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2059
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2060 /* now all input register vars are free */
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2061 code_save_stacks();
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2062 // set_lreg(LREG_LREGISTER,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2063 set_freg(FREG_FREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2064 set_ireg(CREG_REGISTER,0);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2065
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2066 // Struct arguments need emit_copy. it destructs 3 input registers.
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2067 // But it returns no value on a register. So calculate it here.
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2068 // We cannot do this in the previous loop, because the copied struct may be
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2069 // override by other complex arguments. But before this we have to check
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2070 // complex_.
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2071
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2072 if (stargs) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2073 if (complex_) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2074 arg = get_input_arg(caddr(complex_),AS_SAVE,
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2075 pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2076 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg);
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2077 }
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2078 for(stargs=reverse0(stargs);stargs;stargs = cadr(stargs)) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2079 e3 = car(stargs);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2080 e4 = car(e3);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2081 t = caddr(e3);
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2082 arg = get_input_arg(t,AS_ARG,caddr(stargs),cadddr(stargs),0);
444
8bec605d1701 small sized struct
kono
parents: 440
diff changeset
2083 push_struct(e4,t,arg);
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2084 car(e3)=0; // done
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2085 }
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2086 } else {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2087 // last complex argument can use input register
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2088 if (complex_) {
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2089 arg = get_input_arg(caddr(complex_),AS_ARG,pnargs,preg_arg,pfreg_arg);
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
2090 reg_arg_list = compute_complex_arg(complex_,reg_arg_list,arg);
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2091 }
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2092 }
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2093
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2094 nargs = reg_arg = freg_arg = 0;
268
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2095 // calc stack arguments first, it may requires extra registers,
3a368fc37559 MIPS binary continue...
kono
parents: 263
diff changeset
2096 // and we can still use input registers now.
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2097 for (e3 = e1; e3;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2098 increment_function_arg(e3,&nargs,&reg_arg,&freg_arg),
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2099 e3 = cadr(e3)) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2100 if (!(e4=car(e3))) continue;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2101 t=caddr(e3);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2102 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
2103 if (car(arg)!=LVAR) continue;
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2104 g_expr_u(assign_expr0(arg,e4,t,t));
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2105 if (t==LONGLONG||t==ULONGLONG) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2106 if (reg_arg+1==MAX_INPUT_REGISTER_VAR) {
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2107 // half register, half memory case
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2108 arg_assign = list2(
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2109 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
2110 arg,INT,INT),
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2111 arg_assign);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2112 use_input_reg(cadr(r0),1);
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2113 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2114 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2115 car(e3)=0; // done
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2116 }
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2117 nargs = reg_arg = freg_arg = 0;
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2118 for (e3 = e1; e3;
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2119 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
2120 e3 = cadr(e3)) {
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2121 if (!(e4=car(e3))) continue;
487
b4d9809d6ee2 type attribute (half done)
kono
parents: 475
diff changeset
2122 t=type_value(caddr(e3));
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2123 arg = get_input_arg(t,AS_ARG,nargs,reg_arg,freg_arg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2124 if(scalar(t)) {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2125 reg_arg_list = list2(arg,reg_arg_list);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2126 /* protect from input register free */
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2127 if (car(arg)==REGISTER)
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2128 use_input_reg(cadr(arg),1);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2129 g_expr_u(assign_expr0(arg,e4,t,t));
202
601301152d9c *** empty log message ***
kono
parents: 196
diff changeset
2130 } else if (t==LONGLONG||t==ULONGLONG) {
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2131 if (reg_arg+1==MAX_INPUT_REGISTER_VAR) {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2132 // half register, half memory case
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2133 // put whole long long anyway
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2134 arg_assign = list2(
232
8a23c20ac92d *** empty log message ***
kono
parents: 231
diff changeset
2135 assign_expr0(r0=get_input_register_var(reg_arg,0,0),
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2136 arg,INT,INT),
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
2137 arg_assign);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2138 use_input_reg(cadr(r0),1);
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2139 reg_arg_list = list2(r0,reg_arg_list);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2140 } else {
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2141 if (car(arg)==LREGISTER) {
258
22949117768f Complex function argments. Struct is done. Long long is odd.
kono
parents: 257
diff changeset
2142 use_input_reg(cadr(arg),1);
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2143 }
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2144 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2145 reg_arg_list = list2(arg,reg_arg_list);
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2146 g_expr_u(assign_expr0(arg,e4,t,t));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2147 } else if (t==DOUBLE||t==FLOAT) {
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2148 if (reg_arg<MAX_INPUT_REGISTER_VAR) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2149 /* sigh...
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2150 printf requires floating value in integer registers
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2151 */
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2152 if (dots) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2153 if (car(e4)==DRLVAR) {
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2154 special_lvar = cadr(e4);
445
kono
parents: 444
diff changeset
2155 e5 = list3(LVAR,special_lvar,0);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2156 } else {
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2157 special_lvar = new_lvar(SIZE_OF_DOUBLE);
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2158 g_expr(assign_expr0(
445
kono
parents: 444
diff changeset
2159 (e5=list3(LVAR,special_lvar,0)),e4,DOUBLE,t));
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2160 reg_arg_list = list2(e5,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2161 e4 = list2(DREGISTER,freg);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2162 /* freg should not change until XXX */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2163 }
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2164 r0=get_input_register_var(reg_arg,0,0);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2165 r1 = reg_arg+1+MIN_TMP_REG;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2166 if (regs[r1]==PTRC_REG)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2167 clear_ptr_cache_reg(list2(REGISTER,r1));
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2168 /* else if (regs[r1]) error(-1); */
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2169 r1=get_input_register_var_1(reg_arg+1,0,0);
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2170 use_input_reg(cadr(r0),1); /* protect from input register free */
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2171 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
2172 reg_arg_list = list2(r0,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2173 reg_arg_list = list2(r1,reg_arg_list);
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2174 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
2175 arg_assign = list2( assign_expr0(r1,
445
kono
parents: 444
diff changeset
2176 list3(LVAR,special_lvar+SIZE_OF_INT,0),
137
9fb09db54436 fix powerpc get_fregister_var's regs error.
kono
parents: 136
diff changeset
2177 INT,INT), arg_assign);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2178 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2179 }
498
574856cee9da printf double/int mix
kono
parents: 496
diff changeset
2180 if (dots && (freg_arg*8+reg_arg*4)>=32 && freg_arg<MAX_INPUT_DREGISTER_VAR) {
496
5640fb7a270d more bugs...
kono
parents: 495
diff changeset
2181 /*
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
2182 it requires integer register and floating register and
496
5640fb7a270d more bugs...
kono
parents: 495
diff changeset
2183 stack value.
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2184 */
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2185 arg_assign = list2(
445
kono
parents: 444
diff changeset
2186 assign_expr0(list3(LVAR,caller_arg_offset_v(nargs),0),
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
2187 get_input_dregister_var(freg_arg,0,0,1),t,t),
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2188 arg_assign);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2189 }
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2190 reg_arg_list = list2(arg,reg_arg_list);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2191 if (car(arg)==DREGISTER)
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2192 use_input_reg(cadr(arg),1); /* protect from input register free */
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
2193 g_expr_u(assign_expr0(arg,e4,t,t)); /* XXX */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2194 }
259
18837238e306 complex argument pre-calcuration done for power pc
kono
parents: 258
diff changeset
2195 // structs are finished
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2196 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2197 if (max_func_args<nargs) max_func_args=nargs;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2198 for(;arg_assign;arg_assign=cadr(arg_assign)) {
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2199 g_expr_u(car(arg_assign));
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2200 }
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2201 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2202 if (car(e2) == FNAME) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2203 printf("\tbl\tL_%s$stub\n",fn->nm);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2204 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2205 jrn = register_name(cadr(jmp));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2206 printf("\tmtctr %s\n",jrn);
917947ffeb7c power pc version
kono
parents:
diff changeset
2207 printf("\tbctrl\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2208 }
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2209 for(;reg_arg_list;reg_arg_list=cadr(reg_arg_list)) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2210 arg = car(reg_arg_list);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2211 if (car(arg)==REGISTER||car(arg)==DREGISTER||car(arg)==FREGISTER
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2212 ||car(arg)==LREGISTER) {
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2213 // if (car(arg)==LREGISTER)
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2214 // printf("## lreg freeing %d %s %s\n",cadr(arg), lregister_name_high(cadr(arg)), lregister_name_low(cadr(arg)));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2215 free_register(cadr(arg));
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2216 } else if (car(arg)==LVAR&&cadr(arg)<0) free_lvar(cadr(arg));
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2217 }
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2218 if (ret_type==DOUBLE||ret_type==FLOAT) {
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2219 set_freg(RET_FREGISTER,0);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2220 } else if (ret_type==ULONGLONG||ret_type==LONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2221 set_lreg(RET_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2222 use_reg(RET_LREGISTER);
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2223 } else if (ret_type==VOID) {
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2224 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2225 set_ireg(RET_REGISTER,0);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
2226 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
2227 cleanup_lregister0();
105
7e3d59e56a53 save register ( incomplete )
kono
parents: 104
diff changeset
2228 return ret_type;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2229 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2230
917947ffeb7c power pc version
kono
parents:
diff changeset
2231 void
313
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2232 code_alloca(int e1,int reg)
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2233 {
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2234 char *crn,*grn;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2235 int g;
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2236
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2237 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
2238 use_int(reg);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2239 g = get_register();
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2240 crn = register_name(reg);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2241 grn = register_name(g);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2242 // printf("\trlwinm r0,%s,0,0,27\n",crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2243 printf("\tlwz %s,0(r1)\n",grn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2244 printf("\tneg %s,%s\n",crn,crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2245 printf("\tstwux %s,r1,%s\n",grn,crn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2246 // printf("\tstw %s,0(r1)\n",grn);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2247 if (!max_func_arg_label) max_func_arg_label = fwdlabel();
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2248 printf("\taddis r1,r1,ha16(L_%d)\n",max_func_arg_label);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2249 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
2250 free_register(g);
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2251 }
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2252
f73b93de216a alloca done for ia32, powerpc, mips
kono
parents: 308
diff changeset
2253 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2254 code_frame_pointer(int e3) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2255 use_int(e3);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2256 #if R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2257 printf("\tmr r1,%s\n",register_name(e3));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2258 #else
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2259 printf("\tmr r30,%s\n",register_name(e3));
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2260 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2261 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2262
917947ffeb7c power pc version
kono
parents:
diff changeset
2263
917947ffeb7c power pc version
kono
parents:
diff changeset
2264 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2265 code_fix_frame_pointer(int disp_offset) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2266 int l = 0;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2267 printf("\tla r30,");
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2268 printf("lo16(%d)(r30)\n",FUNC_LVAR);
89
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_jmp(char *s) {
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;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2275 printf("\tb L_%s$stub\n",s);
283
230a3b98b843 MIPS jump work.
kono
parents: 280
diff changeset
2276 control=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2277 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2278
917947ffeb7c power pc version
kono
parents:
diff changeset
2279
917947ffeb7c power pc version
kono
parents:
diff changeset
2280 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2281 code_indirect_jmp(int e2) {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2282 max_reg_var = REG_VAR_BASE-REG_VAR_MIN;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2283 max_freg_var = FREG_VAR_BASE-FREG_VAR_MIN;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2284 use_int(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2285 printf("\tmtctr %s\n",register_name(e2));
917947ffeb7c power pc version
kono
parents:
diff changeset
2286 printf("\tbctr\n");
283
230a3b98b843 MIPS jump work.
kono
parents: 280
diff changeset
2287 control=0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2288 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2289
355
6188f66c0c0b cond op, and arg scope.
kono
parents: 354
diff changeset
2290 void
6188f66c0c0b cond op, and arg scope.
kono
parents: 354
diff changeset
2291 code_rindirect(int e1, int reg,int offset, int sign,int sz)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2292 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2293 char *crn,*rrn;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2294 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2295 if (!is_int_reg(creg)) error(-1);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2296 crn=register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2297 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2298 rrn=register_name(reg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2299 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2300 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2301 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2302 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
2303 cext(sign,sz,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2304 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2305
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2306 #if FLOAT_CODE
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2307 int
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2308 code_drindirect(int e1, int reg,int offset, int d)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2309 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2310 char *crn;
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2311 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2312 if (!is_int_reg(creg)) error(-1);
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2313 crn=register_name(creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2314 use_float(d,reg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2315 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2316 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2317 }
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2318 printf("\t%s %s,lo16(%d)(%s)\n",fload(d),
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2319 fregister_name(reg),offset,crn);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2320
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2321 return d?DOUBLE:FLOAT;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2322 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2323 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2324
440
a531bbf572e3 regression test (case, float, long long)
kono
parents: 438
diff changeset
2325 #if LONGLONG_CODE
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2326 static void
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2327 lload(int creg,int reg,int offset)
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2328 {
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2329 char *crn = register_name(creg);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2330 if (LARGE_OFFSET(offset)) {
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2331 printf("\taddis %s,%s,ha16(%d)\n",crn,crn,offset);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2332 }
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2333 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2334 if (creg!=regv_l(reg)) {
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2335 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_low(reg),offset,crn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2336 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset+SIZE_OF_INT,crn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2337 } else {
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2338 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset+SIZE_OF_INT,crn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2339 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_low(reg),offset,crn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2340 }
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2341 #else
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2342 if (creg!=regv_h(reg)) {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2343 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset,crn);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2344 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
2345 } else {
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2346 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
2347 printf("\tlwz %s,lo16(%d)(%s)\n",lregister_name_high(reg),offset,crn);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2348 }
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
2349 #endif
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2350 }
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2351
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2352 int
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2353 code_lrindirect(int e1, int reg, int offset, int us)
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2354 {
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2355 char *crn;
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2356 int creg0;
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2357
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2358 g_expr(e1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2359 if (!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2360 crn=register_name(creg0=creg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2361 use_longlong(reg);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
2362 lload(creg0,reg,offset);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2363 return us?ULONGLONG:LONGLONG;
196
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2364 }
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2365 #endif
5f70abd9453d *** empty log message ***
kono
parents: 195
diff changeset
2366
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2367 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2368 code_assign_gvar(int e2,int creg,int byte) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2369 use_int(creg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2370 code_ldf(cstore(byte),register_name(creg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2371 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2372 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2373
917947ffeb7c power pc version
kono
parents:
diff changeset
2374 void
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2375 code_assign_lvar(int e2,int creg,int byte) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2376 char *crn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2377 use_int(creg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2378 crn=register_name(creg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2379 lvar_intro(e2);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2380 printf("\t%s %s,",cstore(byte),crn);
165
kono
parents: 164
diff changeset
2381 lvar(e2);
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 void
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2385 code_assign_register(int e2,int byte,int creg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2386 use_int(creg);
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2387 if (e2!=creg)
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
2388 printf("\tmr %s,%s\n",register_name(e2),register_name(creg));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2389 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2390
917947ffeb7c power pc version
kono
parents:
diff changeset
2391 void
118
07b91b625f84 assignment optimization
kono
parents: 117
diff changeset
2392 code_assign(int e2,int byte,int creg) {
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2393 char *drn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2394 char *crn;
233
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2395 use_int(e2);
2208a18f3799 *** empty log message ***
kono
parents: 232
diff changeset
2396 drn=register_name(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2397 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2398 crn=register_name(creg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2399
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
2400 printf("\t%s %s,0(%s)\n",cstore(byte),crn,drn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2401 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2402
917947ffeb7c power pc version
kono
parents:
diff changeset
2403
917947ffeb7c power pc version
kono
parents:
diff changeset
2404 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2405 code_register_assop(int e2,int reg, int op,int byte) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2406 // reg <= reg(e2) op=reg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2407 use_int(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2408 tosop(op,e2,reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2409 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2410
917947ffeb7c power pc version
kono
parents:
diff changeset
2411 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2412 code_assop(int op,int creg, int byte,int sign) {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2413 char *xrn,*crn,*drn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2414 int xreg;
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2415 int edx = get_register(); if(!edx) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2416 // (*creg) op = pop()
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2417
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2418 use_int(creg);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2419 xrn = register_name(xreg = emit_pop(0)); /* pop e3 value */
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2420 #if 1
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2421 set_ireg(edx,0);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2422 ld_indexx(byte,0,creg,ireg,sign);
338
7fe7ce0a791f bit-field done for IA32, PowerPC, MIPS.
kono
parents: 336
diff changeset
2423 use_reg(creg); // to clear ptr cache
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2424 tosop(op,ireg,xreg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2425 crn = register_name(ireg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2426 drn = register_name(creg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2427 if (byte==1) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2428 printf("\tstb %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2429 } else if (byte==SIZE_OF_SHORT) {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2430 printf("\tsth %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2431 } else {
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2432 printf("\tstw %s,0(%s)\n",crn,drn);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2433 }
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2434 free_register(creg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2435 emit_pop_free(xreg);
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2436 #else
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
2437 printf("## assop\n\tmr %s,%s\n",register_name(edx),register_name(creg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2438 ld_indexx(byte,0,edx,creg,sign);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2439 tosop(op,creg,xreg);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2440 crn = register_name(creg);
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2441 drn = register_name(edx);
165
kono
parents: 164
diff changeset
2442 if (byte==1) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2443 printf("\tstb %s,0(%s)\n",crn,drn);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2444 } else if (byte==SIZE_OF_SHORT) {
165
kono
parents: 164
diff changeset
2445 printf("\tsth %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2446 } else {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2447 printf("\tstw %s,0(%s)\n",crn,drn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2448 }
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2449 free_register(edx);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2450 emit_pop_free(xreg);
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
2451 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2452 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2453
917947ffeb7c power pc version
kono
parents:
diff changeset
2454 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2455 tosop(int op,int creg,int oreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2456 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2457 int dx = -1;
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2458 int ox = -1;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2459 char *orn,*crn,*drn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2460 // creg = creg op oreg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2461
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2462 use_int(creg);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2463 if(oreg==-1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2464 error(-1);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2465 } else if (oreg<= -REG_LVAR_OFFSET) {
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2466 ox = get_register(); if (ox<0) error(-1);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2467 code_rlvar(oreg+REG_LVAR_OFFSET,ox);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2468 oreg = ox;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2469 }
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2470
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2471 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2472 case LSHIFT:
917947ffeb7c power pc version
kono
parents:
diff changeset
2473 case ULSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2474 shift("slw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2475 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2476 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2477 case RSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2478 shift("sraw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2479 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2480 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2481 case URSHIFT:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2482 shift("srw",creg,oreg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2483 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2484 return;
917947ffeb7c power pc version
kono
parents:
diff changeset
2485 }
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2486 orn = register_name(oreg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2487 crn = register_name(creg);
917947ffeb7c power pc version
kono
parents:
diff changeset
2488 switch(op) {
917947ffeb7c power pc version
kono
parents:
diff changeset
2489 case ADD:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2490 printf("\tadd %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2491 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2492 case SUB:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2493 printf("\tsub %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2494 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2495 case CMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2496 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2497 printf("\tcmpw cr%d,%s,%s\n",cmpflag,crn,orn);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2498 break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2499 case UCMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2500 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2501 printf("\tcmplw cr%d,%s,%s\n",cmpflag,crn,orn);
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2502 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2503 case BAND:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2504 printf("\tand %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2505 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2506 case EOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2507 printf("\txor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2508 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2509 case BOR:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2510 printf("\tor %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2511 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2512 case MUL:
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2513 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2514 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2515 case UMUL:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2516 printf("\tmullw %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2517 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2518 case DIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2519 printf("\tdivw %s,%s,%s\n",crn,crn,orn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2520 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2521 case UDIV:
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2522 printf("\tdivwu %s,%s,%s\n",crn,crn,orn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2523 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
2524 case MOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2525 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2526 drn = register_name(dx);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2527 printf("\tdivw %s,%s,%s\n",drn,crn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2528 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2529 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2530 break;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2531 case UMOD:
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2532 dx=get_register();
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2533 drn = register_name(dx);
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
2534 printf("\tdivwu %s,%s,%s\n",drn,crn,orn);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2535 printf("\tmullw %s,%s,%s\n",drn,drn,orn);
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2536 printf("\tsubf %s,%s,%s\n",crn,drn,crn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2537 break;
112
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2538 default:
fc7de4faedfd *** empty log message ***
kono
parents: 111
diff changeset
2539 error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2540 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2541 if(dx!=-1) free_register(dx);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
2542 if(ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2543 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2544
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2545 int
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2546 code_const_op_p(int op,int v)
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2547 {
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2548 if (car(v)!=CONST) return 0;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2549 if (op==DIV||op==UDIV) return ilog(v);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2550 if (op==BAND||op==MOD||op==UMOD) return 0;
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2551 v = cadr(v);
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
2552 return (-32766<v&&v<32767);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2553 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2554
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
2555 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2556 oprtc(int op,int creg, int v)
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2557 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2558 char *crn;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2559 int l;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2560 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2561 crn = register_name(creg);
240
b59364f5b030 *** empty log message ***
kono
parents: 239
diff changeset
2562 v = cadr(v);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2563
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2564 switch(op) {
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2565 case LSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2566 case ULSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2567 printf("\tslwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2568 return;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2569 case DIV:
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2570 v = ilog(v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2571 case RSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2572 printf("\tsrawi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2573 return;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2574 case UDIV:
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2575 v = ilog(v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2576 case URSHIFT:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2577 printf("\tsrwi %s,%s,%d\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2578 return;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2579 case ADD:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2580 printf("\taddi %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2581 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2582 case SUB:
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2583 printf("\taddi %s,%s,lo16(-%d)\n",crn,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2584 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2585 case CMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2586 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2587 printf("\tcmpwi cr%d,%s,lo16(%d)\n",cmpflag,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2588 break;
354
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2589 case UCMP:
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2590 inc_cmpflag();
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2591 printf("\tcmplwi cr%d,%s,lo16(%d)\n",cmpflag,crn,v);
32cd53208b79 type of fix.
kono
parents: 353
diff changeset
2592 break;
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2593 case EOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2594 printf("\txori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2595 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2596 case BOR:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2597 printf("\tori %s,%s,lo16(%d)\n",crn,crn,v);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2598 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2599 case MUL:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2600 case UMUL:
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2601 if ((l=ilog(v))) {
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2602 printf("\tslwi %s,%s,%d\n",crn,crn,l);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2603 } else
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2604 printf("\tmulli %s,%s,lo16(%d)\n",crn,crn,v);
189
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2605 break;
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2606 default:
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2607 error(-1);
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2608 }
f53d70110377 immediate instructions.
kono
parents: 187
diff changeset
2609 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2610
917947ffeb7c power pc version
kono
parents:
diff changeset
2611 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2612 shift(char *op, int creg, int reg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2613 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2614 char *crn;
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
2615 char *rrn = register_name(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2616 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2617 crn = register_name(creg);
186
6391432ca002 nkf binary fix
kono
parents: 185
diff changeset
2618 printf("\t%s %s,%s,%s\n",op,crn,crn,rrn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2619 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2620
917947ffeb7c power pc version
kono
parents:
diff changeset
2621 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2622 ld_indexx(int byte, int n, int xreg,int creg, int sign)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2623 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2624 char *crn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2625 use_int(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
2626 crn = register_name(creg);
246
0dcc0ec81ed2 MIPS on going (90%)
kono
parents: 245
diff changeset
2627 printf("\t%s %s,%d(%s)\n",cload(byte),register_name(creg),n,
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
2628 register_name(xreg));
246
0dcc0ec81ed2 MIPS on going (90%)
kono
parents: 245
diff changeset
2629 cext(sign,byte,creg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2630 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2631
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2632 int
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2633 code_csvalue()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2634 {
458
0bc9f3273aa7 *** empty log message ***
kono
parents: 456
diff changeset
2635 return glist2(REGISTER,creg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2636 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
2637
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2638 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
2639 code_cmpdimm(int e, int csreg,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2640 {
415
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
2641 int reg,regsv;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2642 /* used in dosiwtch() */
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2643 inc_cmpflag();
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2644 if (-32767<e&&e<32767) {
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2645 printf("\tcmpwi cr%d,%s,%d\n",cmpflag,register_name(csreg),e);
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2646 jcond(label,cond);
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2647 } else {
415
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
2648 regsv = regs[csreg]; regs[csreg]=USING_REG;
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2649 reg = get_register();
415
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
2650 regs[csreg]= regsv;
405
5b76a2bc1177 ARM code-gen-all passed.
kono
parents: 382
diff changeset
2651 code_const(e,reg);
366
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2652 printf("\tcmpw cr%d,%s,%s\n",cmpflag,register_name(csreg),register_name(reg));
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2653 jcond(label,cond);
2d510935c37d *** empty log message ***
kono
parents: 365
diff changeset
2654 free_register(reg);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
2655 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2656 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2657
917947ffeb7c power pc version
kono
parents:
diff changeset
2658 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2659 code_opening(char *filename)
917947ffeb7c power pc version
kono
parents:
diff changeset
2660 {
917947ffeb7c power pc version
kono
parents:
diff changeset
2661 printf("\t.file \"%s\"\n",filename);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2662 /* printf("\t.version\t\"01.01\"\n"); */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2663 /* printf("gcc2_compiled.:\n"); */
917947ffeb7c power pc version
kono
parents:
diff changeset
2664 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
2665 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2666
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2667 #define CRBITSIZ 4
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2668
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2669 static int
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2670 rexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2671 {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2672 int t,flag=-1,eq=-1,neg=-1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2673 char *rn;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2674 switch(car(e1)) {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2675 case GT: t=INT; flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2676 case UGT: t=0; flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2677 case GE: t=INT; flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2678 case UGE: t=0; flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2679 case LT: t=INT; flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2680 case ULT: t=0; flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2681 case LE: t=INT; flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2682 case ULE: t=0; flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2683 case EQ: t=INT; flag = 3; break;
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2684 case NEQ: t=INT; flag = 3; neg=3; break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2685 default: return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2686 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2687 g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1)));
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2688 use_int(reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2689 rn = register_name(reg);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2690 t = CRBITSIZ*cmpflag;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2691 if (eq>0) {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2692 printf("\tcror %d,%d,%d\n",t+flag-1,t+eq-1,t+flag-1);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2693 }
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2694 if (neg>0) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2695 neg = t+neg-1,
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2696 printf("\tcrnor %d,%d,%d\n",neg,neg,neg);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2697 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2698 printf("\tmfcr %s\n",rn);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
2699 printf("\trlwinm %s,%s,%d,1\n",rn,rn,t+flag);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2700 return 1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2701 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
2702
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
2703 int
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2704 rexpr(int e1, int l1, int cond,int t)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2705 {
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2706 char *s;
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2707 switch(car(e1)+BNOT*(!cond)) {
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2708 case GT: s=code_gt(1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2709 case UGT: s=code_ugt(1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2710 case GE: s=code_ge(1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2711 case UGE: s=code_uge(1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2712 case LT: s=code_ge(!1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2713 case ULT: s=code_uge(!1);break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2714 case LE: s=code_gt(!1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2715 case ULE: s=code_ugt(!1);break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2716 case EQ: s=code_eq(1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2717 case NEQ: s=code_eq(!1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2718 case GT+BNOT: s=code_gt(0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2719 case UGT+BNOT: s=code_ugt(0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2720 case GE+BNOT: s=code_ge(0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2721 case UGE+BNOT: s=code_uge(0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2722 case LT+BNOT: s=code_ge(!0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2723 case ULT+BNOT: s=code_uge(!0);break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2724 case LE+BNOT: s=code_gt(!0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2725 case ULE+BNOT: s=code_ugt(!0);break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2726 case EQ+BNOT: s=code_eq(0); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
2727 case NEQ+BNOT: s=code_eq(!0); break;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2728 default: error(-1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2729 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2730 g_expr(list3((t==INT?CMP:UCMP),cadr(e1),caddr(e1)));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
2731 printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1);
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
2732 return l1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2733 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2734
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
2735 static void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2736 jcond(int l, char cond)
917947ffeb7c power pc version
kono
parents:
diff changeset
2737 {
297
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2738 if (cond==LT) {
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2739 printf("\tb%s cr%d,L_%d\n",code_ge(0),cmpflag,l);
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2740 } else if (cond==1||cond==0) {
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2741 printf("\tb%s cr%d,L_%d\n",cond?"ne":"eq",cmpflag,l);
0f79c95df73a switch index no compile error
kono
parents: 292
diff changeset
2742 } else error(-1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2743 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2744
917947ffeb7c power pc version
kono
parents:
diff changeset
2745 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2746 jmp(int l)
917947ffeb7c power pc version
kono
parents:
diff changeset
2747 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2748 printf("\tb\tL_%d\n",l);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2749 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2750
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
2751 extern void
456
b8f95294eb77 inline continue... if test passed.
kono
parents: 453
diff changeset
2752 code_comment(char *s)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2753 {
307
fda28752d301 stdarg (varargs done... PowerPC, IA32 checked)
kono
parents: 305
diff changeset
2754 printf("## %s",s);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2755 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2756
917947ffeb7c power pc version
kono
parents:
diff changeset
2757 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2758 code_enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2759 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2760 if (output_mode!=TEXT_EMIT_MODE)
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
2761 text_mode(0);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2762 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2763 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2764 if (stmode!=STATIC)
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2765 printf(".globl _%s\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2766 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2767 printf("\t.type\t%s,@function\n",name);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2768 #endif
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2769 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
2770 code_disp_label=fwdlabel();
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2771 #if 0
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2772 printf("\tla r1,lo16(L_%d)(r30)\n",code_disp_label);
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2773 #else
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2774 printf("\tla r1,lo16(L_%d)(r30)\n",code_disp_label);
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2775 printf("\taddis r1,r1,ha16(L_%d)\n",code_disp_label);
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2776 #endif
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2777 printf("\tbcl 20,31,L_%d\n",code_base = fwdlabel());
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2778 fwddef(code_base);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2779 printf("\tmflr r31\n");
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
2780 max_func_args = 0;
489
79fef53141b4 fix clear_ptr_cache in MIPS/ARM.
kono
parents: 487
diff changeset
2781 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2782 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2783
917947ffeb7c power pc version
kono
parents:
diff changeset
2784
917947ffeb7c power pc version
kono
parents:
diff changeset
2785 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2786 code_enter1(int args)
917947ffeb7c power pc version
kono
parents:
diff changeset
2787 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
2788 // set_lreg(LREG_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2789 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2790 set_freg(FREG_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2791 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2792
917947ffeb7c power pc version
kono
parents:
diff changeset
2793 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2794 code_leave(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2795 {
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2796 int r1_offsetv;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2797 disp&= -SIZE_OF_INT;
449
c55363eff5e5 parallel assignment (modify not completed)
kono
parents: 445
diff changeset
2798 r1_offsetv = -disp+max_func_args*SIZE_OF_INT +code_disp_offset +8+32;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2799
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2800 printf(".set L_%d,%d\n",code_disp_label,-r1_offsetv);
417
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2801 if (max_func_arg_label) {
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2802 printf(".set L_%d,%d\n",max_func_arg_label,max_func_args*SIZE_OF_INT+24);
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2803 max_func_arg_label = 0;
98888da30b35 code jump fixes (not finished)
kono
parents: 416
diff changeset
2804 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2805 local_table();
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2806 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2807 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2808
917947ffeb7c power pc version
kono
parents:
diff changeset
2809 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2810 enter(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2811 {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2812 if (output_mode!=TEXT_EMIT_MODE)
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
2813 text_mode(0);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2814 else
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2815 printf("\t.align 2\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2816 if (stmode!=STATIC)
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2817 printf(".globl _%s\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2818 /*
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2819 printf("\t.type\t%s,@function\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2820 */
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
2821 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
2822 code_setup=fwdlabel();
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2823 printf("\tmflr r0\n");
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2824 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
2825 code_base=fwdlabel();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2826 fwddef(code_base);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2827 r1_offset_label = fwdlabel();
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2828 lvar_offset_label = fwdlabel();
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2829 #if 0
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2830 printf("\taddi r30,r1,lo16(-L_%d)\n",lvar_offset_label);
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2831 printf("\tstwu r1,lo16(-L_%d)(r1)\n",r1_offset_label);
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2832 // printf("\tmr r30,r1\n");
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2833 #else
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2834 printf("\taddi r30,r1,lo16(-L_%d)\n",lvar_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2835 printf("\tlis r31,ha16(-L_%d)\n",r1_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2836 printf("\taddi r31,r31,lo16(-L_%d)\n",r1_offset_label);
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2837 printf("\tstwux r1,r1,r31\n");
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
2838 #endif
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2839 printf("\tmflr r31\n");
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2840 max_func_args = 0;
489
79fef53141b4 fix clear_ptr_cache in MIPS/ARM.
kono
parents: 487
diff changeset
2841 clear_ptr_cache();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2842 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2843
917947ffeb7c power pc version
kono
parents:
diff changeset
2844 void
917947ffeb7c power pc version
kono
parents:
diff changeset
2845 enter1()
917947ffeb7c power pc version
kono
parents:
diff changeset
2846 {
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
2847 text_mode(0);
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2848 // set_lreg(LREG_LREGISTER,0);
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2849 set_ireg(CREG_REGISTER,0);
106
3618c0efe9d3 fix save_input_register
kono
parents: 105
diff changeset
2850 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
2851 }
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2852
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2853 int
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2854 reg_save_offset()
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2855 {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2856 return -(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2857 (REAL_MAX_REGISTER-(REG_VAR_BASE-max_reg_var))*SIZE_OF_INT+
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2858 (REAL_MAX_FREGISTER-(FREG_VAR_BASE-max_freg_var))*SIZE_OF_DOUBLE
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2859 );
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2860 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2861
917947ffeb7c power pc version
kono
parents:
diff changeset
2862 void
450
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2863 code_label_call(int l)
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2864 {
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2865 printf("\tbl\tL_%d\n",l);
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2866 }
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2867
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2868 void
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2869 code_ret()
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2870 {
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2871 printf("\tblr\n");
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2872 }
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2873
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2874 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2875 leave(int control, char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
2876 {
130
fea1b499d47b fix register var save
kono
parents: 129
diff changeset
2877 int retcont1=0,sz;
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2878
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2879 if (max_freg_var>=0 && max_freg_var<=3) max_freg_var=3;
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2880 reg_save = reg_save_offset();
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2881
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2882 if (control) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2883 code_set_return_register(1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2884 }
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2885 if (retcont) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2886 if (control) jmp(retlabel);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2887 retcont1 = fwdlabel();
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2888 fwddef(retcont);
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2889 if (cadr(fnptr->ty)==FLOAT||cadr(fnptr->ty)==DOUBLE) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2890 printf("\tfmr f1,f31\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2891 } else if (cadr(fnptr->ty)>0&&(
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2892 car(cadr(fnptr->ty))==STRUCT ||
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2893 car(cadr(fnptr->ty))==UNION)) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2894 sz = size(cadr(fnptr->ty));
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2895 printf("\tli r7,%d\n",sz);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2896 printf("\tsubl r6,r7,r30\n");
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2897 printf("\tlwz r3,lo16(%d)(r30)\n",(my_func_args-1)*SIZE_OF_INT);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2898 emit_copy(6,3,sz,0,1,1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2899 } else if (cadr(fnptr->ty)!=VOID) {
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2900 printf("\tmr r3,r29\n");
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2901 }
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2902 #if !R1SAVE
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2903 printf("\tla r1,lo16(%d)(r30)\n",
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2904 -reg_save+my_func_args*SIZE_OF_INT);
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2905 #endif
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2906 printf("\tb L_%d\n",retcont1);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
2907 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2908 fwddef(retlabel);
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2909 printf("\tlwz r1,0(r1)\n");
128
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2910 if (retcont) {
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2911 fwddef(retcont1);
d497c39add36 arg.c works (?)
kono
parents: 127
diff changeset
2912 }
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2913 if (max_freg_var>=0) {
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2914 printf("\tlmw r%d,%d(r1)\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2915 REG_VAR_BASE-max_reg_var,reg_save);
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2916 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
2917 printf("\tb restFP+%d ; restore f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2918 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2919 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
2920 } else {
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2921 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
2922 printf("\tmtlr r0\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2923 printf("\tlmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2924 REG_VAR_BASE-max_reg_var,reg_save);
450
eaf9e2746c83 parallel assign for simple expr. (too complex solution)
kono
parents: 449
diff changeset
2925 code_ret();
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2926 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2927
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
2928 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
2929 fwddef(code_setup);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2930 printf("\tstmw r%d,%d(r1)\n",
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2931 REG_VAR_BASE-max_reg_var,reg_save);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2932 printf("\tstw r0,8(r1)\n");
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2933 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
2934 printf("\tb saveFP+%d ; save f%d-f31\n",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2935 freg_save,
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2936 FREG_VAR_BASE-max_freg_var);
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2937 else {
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2938 printf("\tblr\n");
110
fb502a0071f8 first binary run
kono
parents: 109
diff changeset
2939 }
100
a9e6f2a2946f Wrote all code for PowerPC and no compile error. Let's fix all bugs...
kono
parents: 99
diff changeset
2940
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
2941 code_offset_set();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2942 local_table();
917947ffeb7c power pc version
kono
parents:
diff changeset
2943 labelno++;
208
70b1da1864f6 *** empty log message ***
kono
parents: 207
diff changeset
2944 // free_all_register();
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2945 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2946
917947ffeb7c power pc version
kono
parents:
diff changeset
2947
917947ffeb7c power pc version
kono
parents:
diff changeset
2948 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2949 code_set_return_register(int mode) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
2950 if (cadr(fnptr->ty)==DOUBLE||cadr(fnptr->ty)==FLOAT) {
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2951 set_freg(RET_FREGISTER,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2952 } else if (cadr(fnptr->ty)==LONGLONG||cadr(fnptr->ty)==ULONGLONG) {
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2953 set_lreg(RET_LREGISTER,mode);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
2954 } else if (cadr(fnptr->ty)==VOID) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2955 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2956 set_ireg(RET_REGISTER,mode);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
2957 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2958 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2959
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2960 int
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2961 code_get_fixed_creg(int reg,int type) {
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2962 return creg;
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2963 }
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2964
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2965 void
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2966 code_set_fixed_creg(int reg,int mode,int type) {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2967 if (type==FLOAT||type==DOUBLE) {
187
dffcccf8b1cb nested COND
kono
parents: 186
diff changeset
2968 set_freg(reg,mode);
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
2969 } else if (type==LONGLONG||type==ULONGLONG) {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
2970 set_lreg(reg,mode);
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
2971 // use_reg(reg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2972 } else {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
2973 set_ireg(reg,mode);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
2974 }
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2975 }
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2976
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
2977 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2978 gen_gdecl(char *n, int gpc)
917947ffeb7c power pc version
kono
parents:
diff changeset
2979 {
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2980 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2981 if (stmode!=STATIC)
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
2982 printf(".globl _%s\n",n);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
2983 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
2984 }
917947ffeb7c power pc version
kono
parents:
diff changeset
2985
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2986 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2987 ascii(char *s)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2988 {
517
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
2989 cstring_mode();
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2990 printf("\t.ascii \"");
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2991 while(*s) {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2992 if (*s=='\n')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2993 printf("%cn",92);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2994 else if (*s<' ')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2995 printf("%c%03o",92,*s);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2996 else if (*s=='\\')
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2997 printf("\\\\");
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2998 else if (*s==34)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
2999 printf("%c%c",92,34);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3000 else
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3001 printf("%c",*s);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3002 s++;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3003 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3004 printf("\\0%c\n\t.align 2\n",34);
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 int
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3008 emit_string_label() {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3009 int lb;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3010
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3011 lb=fwdlabel();
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3012 cstring_mode();
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3013 printf("L_%d:\n",lb);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3014 return lb;
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3015 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3016
518
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3017 extern void
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3018 emit_string(char *s,int t)
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3019 {
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3020 t = type_value(t);
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3021 if (car(t)==ARRAY &&
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3022 (type_value(cadr(t))==CHAR||type_value(cadr(t))==UCHAR)) {
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3023 ascii(s);
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3024 } else {
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3025 int l = emit_string_label();
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3026 ascii(s);
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3027 emit_label(l);
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3028 }
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3029 return;
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3030 }
9f2d6aea201f cstring fix.... finally
kono
parents: 517
diff changeset
3031
415
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3032 void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3033 align(int t)
917947ffeb7c power pc version
kono
parents:
diff changeset
3034 {
415
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3035 int d;
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3036 switch(t) {
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3037 case CHAR: case UCHAR: return;
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3038 case SHORT: case USHORT: d = data_alignment & 1; break;
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3039 default: d = data_alignment & 3;
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3040 }
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3041 if (d) {
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3042 printf("\t.align 2\n");
bdf900926f32 fix cpmd register
kono
parents: 411
diff changeset
3043 data_alignment = 0;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3044 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3045 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3046
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3047 void
517
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3048 emit_global(NMTBL *n,int a,int e)
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3049 {
517
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3050 int t = type_value(n->ty);
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3051 if (e>0 && car(e)==STRING && t>0 && car(t)==ARRAY &&
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3052 (type_value(cadr(t))==CHAR||type_value(cadr(t))==UCHAR)) {
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3053 cstring_mode();
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3054 } else
d686497e8fd2 cstring array fix.
kono
parents: 516
diff changeset
3055 data_mode(n->nm);
542
492f06738550 working... (struct init fix)
kono
parents: 536
diff changeset
3056 if (n && n->sc!=STATIC)
492f06738550 working... (struct init fix)
kono
parents: 536
diff changeset
3057 printf("\t.globl\t_%s\n",n->nm);
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3058 printf("_%s:\n",n->nm);
340
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
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3062 emit_space(int sp)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3063 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3064 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3065 printf("\t.space\t%d\n",sp);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3066 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3067
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3068 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3069 emit_char(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3070 {
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3071 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3072 printf("\t.byte %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3073 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3074
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3075 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3076 emit_short(int d)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3077 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3078 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3079 printf("\t.short %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3080 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3081
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3082 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3083 emit_int(int d)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3084 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3085 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3086 printf("\t.long %d\n",d);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3087 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3088
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3089 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3090 emit_longlong(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3091 {
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
3092 #if LONGLONG_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3093 long long d = lcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3094 data_mode(0);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3095 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3096 printf("\t.long\t0x%x,0x%x\n",code_l1(d),code_l2(d));
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3097 #else
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3098 printf("\t.long\t0x%x,0x%x\n",code_l2(d),code_l1(d));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3099 #endif
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3100 #endif
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3101 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3102
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3103 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3104 emit_double(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3105 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3106 #if FLOAT_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3107 double d = dcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3108 data_mode(0);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3109 #if ENDIAN_D==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3110 printf("\t.long\t0x%x,0x%x\n",code_d1(d),code_d2(d));
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3111 #else
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3112 printf("\t.long\t0x%x,0x%x\n",code_d2(d),code_d1(d));
339
375d21a2b845 emit_data
kono
parents: 338
diff changeset
3113 #endif
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3114 #endif
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3115 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3116
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3117 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3118 emit_float(int e)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3119 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3120 #if FLOAT_CODE
341
ca34f02b2056 ptr cache speed up
kono
parents: 340
diff changeset
3121 float f = dcadr(e);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3122 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3123 printf("\t.long\t0x%x\n",*(int *)&f);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3124 #endif
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3125 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3126
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3127 extern void
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3128 emit_address(char *s,int offset)
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3129 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3130 data_mode(0);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3131 if (offset)
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3132 printf("\t.long _%s+%d\n",s,offset);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3133 else
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3134 printf("\t.long _%s\n",s);
340
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3135 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3136
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3137 extern void
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3138 emit_label(int labelno)
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3139 {
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3140 data_mode(0);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3141 printf("\t.long L_%d\n",labelno);
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3142 }
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3143
0150de6a3244 emit_data moved.
kono
parents: 339
diff changeset
3144 extern void
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3145 emit_data_closing(NMTBL *n)
917947ffeb7c power pc version
kono
parents:
diff changeset
3146 {
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3147 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3148 int lb;
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3149 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3150 if (mode==GDECL) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3151 data_mode(0);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3152 #ifdef DOT_SIZE
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3153 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3154 printf("L_%d:\n",lb);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3155 printf("\t.size\t%s,L_%d-%s\n",n->nm,lb,n->nm);
126
1d1612fe705a *** empty log message ***
kono
parents: 125
diff changeset
3156 #endif
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3157 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3158 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3159
917947ffeb7c power pc version
kono
parents:
diff changeset
3160 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3161 global_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
3162 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3163 NMTBL *n;
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3164 int init; char *extrn;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3165 init=0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3166 for(n = global_list;n!=&null_nptr;n = n->next) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3167 if ((n->sc == GVAR) && n->dsp != -1) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3168 /* n->dsp = -1 means initialized global */
917947ffeb7c power pc version
kono
parents:
diff changeset
3169 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3170 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
3171 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
3172 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3173 printf(".comm _%s,%d\n",n->nm,size(n->ty));
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3174 } else if ((n->sc==STATIC) && n->dsp != -1) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3175 /* n->dsp = -1 means initialized global */
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3176 if (init==0) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3177 data_mode(0);
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3178 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3179 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3180 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3181 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3182 }
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3183 for(n = global_list;n!=&null_nptr;n = n->next) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3184 if (is_code(n)||is_function(n)) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3185 extrn = n->nm;
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3186 if (n->sc==EXTRN1) {
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3187 data_mode(0);
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3188 printf(".picsymbol_stub\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3189 printf("L_%s$stub:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3190 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3191 printf("\tmflr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3192 printf("\tbcl 20,31,L0$_%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3193 printf("L0$_%s:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3194 printf("\tmflr r11\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3195 printf("\taddis r11,r11,ha16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3196 printf("\tmtlr r0\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3197 printf("\tlwz r12,lo16(L_%s$lazy_ptr-L0$_%s)(r11)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3198 printf("\tmtctr r12\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3199 printf("\taddi r11,r11,lo16(L_%s$lazy_ptr-L0$_%s)\n",extrn,extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3200 printf("\tbctr\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3201 printf(".data\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3202 printf(".lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3203 printf("L_%s$lazy_ptr:\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3204 printf("\t.indirect_symbol _%s\n",extrn);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3205 printf("\t.long dyld_stub_binding_helper\n");
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3206 } else if (n->sc==FUNCTION||n->sc==CODE) {
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3207 text_mode(0);
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
3208 printf("\t.set L_%s$stub,_%s\n",extrn,extrn);
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3209 data_mode(0);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3210 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
3211 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3212 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3213 }
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3214 init=0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3215 for(n = global_list;n!=&null_nptr;n = n->next) {
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3216 if (n->sc == GVAR) {
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3217 if (init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3218 printf(".data\n");
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3219 init=1;
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3220 }
116
b14ff9671c90 register offset fix
kono
parents: 115
diff changeset
3221 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
3222 }
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3223 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3224 init = 0;
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3225 for(n = global_list;n!=&null_nptr;n = n->next) {
453
1e5ca85d3f97 inline on going...
kono
parents: 450
diff changeset
3226 if ((is_code(n)||is_function(n))&&
1e5ca85d3f97 inline on going...
kono
parents: 450
diff changeset
3227 !has_attr(n,FNAME)) // not used as value
1e5ca85d3f97 inline on going...
kono
parents: 450
diff changeset
3228 continue;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3229 if (n->sc==EXTRN1) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3230 if(init==0) {
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3231 printf(".data\n");
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3232 printf(".non_lazy_symbol_pointer\n");
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3233 init=1;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3234 }
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3235 printf("L_%s$non_lazy_ptr:\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3236 printf("\t.indirect_symbol _%s\n",n->nm);
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3237 printf("\t.long\t0\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3238 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3239 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3240 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3241
917947ffeb7c power pc version
kono
parents:
diff changeset
3242 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3243 local_table(void)
917947ffeb7c power pc version
kono
parents:
diff changeset
3244 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3245 NMTBL *n;
917947ffeb7c power pc version
kono
parents:
diff changeset
3246 int init;
917947ffeb7c power pc version
kono
parents:
diff changeset
3247 init=0;
917947ffeb7c power pc version
kono
parents:
diff changeset
3248 /* static local variables */
350
43099915f4c2 name table reconfigure continue...
kono
parents: 348
diff changeset
3249 for(n = local_static_list;n!=&null_nptr;n = n->next) {
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3250 if (n->sc == GVAR) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3251 if (init==0) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3252 data_mode(0);
917947ffeb7c power pc version
kono
parents:
diff changeset
3253 init=1;
917947ffeb7c power pc version
kono
parents:
diff changeset
3254 }
156
da529eab5618 static initialization
kono
parents: 153
diff changeset
3255 if (n->dsp != -1) /* initialized static */
da529eab5618 static initialization
kono
parents: 153
diff changeset
3256 printf(".lcomm _%s,%d\n",n->nm,size(n->ty));
da529eab5618 static initialization
kono
parents: 153
diff changeset
3257 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
3258 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3259 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3260 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3261
917947ffeb7c power pc version
kono
parents:
diff changeset
3262 void
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3263 cstring_mode(int align)
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3264 {
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3265 if (output_mode!=RODATA_EMIT_MODE) {
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3266 printf(".cstring\n\t.align 2\n");
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3267 output_mode = RODATA_EMIT_MODE;
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3268 }
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3269 }
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3270
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3271 void
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3272 text_mode(int align)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3273 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3274 if (output_mode!=TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3275 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3276 printf("\t.align 2\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3277 output_mode = TEXT_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
3278 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3279 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3280
917947ffeb7c power pc version
kono
parents:
diff changeset
3281 void
917947ffeb7c power pc version
kono
parents:
diff changeset
3282 data_mode(char *name)
917947ffeb7c power pc version
kono
parents:
diff changeset
3283 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3284 if (output_mode!=DATA_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3285 printf(".data\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3286 output_mode = DATA_EMIT_MODE;
917947ffeb7c power pc version
kono
parents:
diff changeset
3287 }
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3288 /*
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3289 if (name)
917947ffeb7c power pc version
kono
parents:
diff changeset
3290 printf("\t.type\t%s,@object\n",name);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3291 */
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3292 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3293
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3294 #if FLOAT_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3295
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3296 /* floating point */
917947ffeb7c power pc version
kono
parents:
diff changeset
3297
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3298 static int float_one_lib_used=0;
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3299 static char *float_one_lib[] = {
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3300 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3301 /* ".literal8", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3302 " .align 3",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3303 "__float_one:",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3304 " .long 1065353216",
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3305 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3306 /* ".set L__float_one$non_lazy_ptr,__float_one", */
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3307 0
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3308 };
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3309 static int float_zero_lib_used=0;
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3310 static char *float_zero_lib[] = {
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3311 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3312 /* ".literal8", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3313 " .align 3",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3314 "__float_zero:",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3315 " .long 0",
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3316 ".text",
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3317 /* ".set L__float_zero$non_lazy_ptr,__float_zero", */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3318 0
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3319 };
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3320
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3321 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
3322 fstore(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3323 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3324 return (d?"stfd":"stfs");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3325 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3326
917947ffeb7c power pc version
kono
parents:
diff changeset
3327 char *
917947ffeb7c power pc version
kono
parents:
diff changeset
3328 fload(int d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3329 {
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3330 return d?"lfd":"lfs";
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3331 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3332
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3333 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3334 code_cmp_dregister(int e2,int d,int label,int cond)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3335 {
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3336 char *frn,*rrn,*grn;
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3337 int greg,r;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3338 grn = register_name(greg = get_dregister(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3339 use_float(d,e2);
132
07eb1249f07a *** empty log message ***
kono
parents: 131
diff changeset
3340 frn = register_name(e2);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3341 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3342 r = get_ptr_cache(&float_zero);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3343 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3344 printf("\tlfs %s,0(%s)\n",grn,rrn);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3345 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3346 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,grn,frn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3347 free_register(greg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3348 jcond(label,cond);
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3349 return;
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3350 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3351
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3352 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3353 code_dregister(int e2,int freg,int d)
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3354 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3355 use_float(d,freg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3356 if (freg!=e2) {
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3357 if (is_int_reg(e2)) error(-1);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3358 printf("\tfmr %s,%s\n",fregister_name(freg),fregister_name(e2));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3359 }
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3360 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3361
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3362 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3363 code_dassign_gvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3364 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3365 use_float(d,freg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3366 code_ldf(fstore(d),fregister_name(freg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3367 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3368 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3369
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3370 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3371 code_dassign_lvar(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3372 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3373 use_float(d,freg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3374 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3375 printf("\t%s %s,",fstore(d),fregister_name(freg));
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3376 lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3377 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3378
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3379 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3380 code_dassign(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3381 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3382 use_float(d,freg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3383 printf("\t%s %s,0(%s)\n",fstore(d),fregister_name(freg),register_name(e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3384 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3385
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3386 void
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3387 code_dassign_dregister(int e2,int d,int freg) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3388 use_float(d,freg);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3389 if (e2!=freg) {
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3390 printf("\tfmr %s,%s\n",fregister_name(e2),fregister_name(freg));
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3391 }
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3392 }
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3393
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3394 static double d0 = 1.0;
917947ffeb7c power pc version
kono
parents:
diff changeset
3395
917947ffeb7c power pc version
kono
parents:
diff changeset
3396 int
917947ffeb7c power pc version
kono
parents:
diff changeset
3397 code_d1(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3398 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3399 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3400 return (i[1] == 0x3ff00000)?j[0]:j[1];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3401 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3402
917947ffeb7c power pc version
kono
parents:
diff changeset
3403 int
917947ffeb7c power pc version
kono
parents:
diff changeset
3404 code_d2(double d)
917947ffeb7c power pc version
kono
parents:
diff changeset
3405 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3406 int *i = (int *)&d0; int *j = (int *)&d;
99
53899975154c *** empty log message ***
kono
parents: 98
diff changeset
3407 return (i[1] == 0x3ff00000)?j[1]:j[0];
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3408 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3409
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3410 int
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3411 code_f(double d)
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3412 {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3413 float f = d;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3414 int *j = (int *)&f;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3415 return *j;
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3416 }
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3417
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3418 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3419
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3420 code_dconst(int e2,int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3421 {
917947ffeb7c power pc version
kono
parents:
diff changeset
3422 int lb;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3423 double value = dcadr(e2);
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3424 int r;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3425 char *rrn,*frn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3426
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3427 use_float(d,freg);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3428 frn = fregister_name(freg);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3429 if (value==0.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3430 float_zero_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3431 r = get_ptr_cache(&float_zero);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3432 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3433 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3434 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3435 }
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3436 if (value==1.0) {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3437 float_one_lib_used=1;
109
e09f9de6f5d3 *** empty log message ***
kono
parents: 108
diff changeset
3438 r = get_ptr_cache(&float_one);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
3439 rrn = register_name(r);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3440 printf("\tlfs %s,0(%s)\n",frn,rrn);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3441 return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3442 }
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3443 rrn = register_name((r=get_register()));
230
d60c6c31f63a *** empty log message ***
kono
parents: 229
diff changeset
3444 use_reg(r); // to clear ptr cache
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3445 printf(" \t.data\n\t.align 3\n");
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3446 lb=fwdlabel();
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3447 printf("L_%d:\n",lb);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3448 if (d) {
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3449 #if ENDIAN_D==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3450 printf("\t.long\t0x%x,0x%x\n",code_d1(value),code_d2(value));
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3451 #else
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3452 printf("\t.long\t0x%x,0x%x\n",code_d2(value),code_d1(value));
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
3453 #endif
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3454 } else {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3455 printf("\t.long\t0x%x\n",code_f(value));
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3456 }
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3457 if (output_mode==TEXT_EMIT_MODE) {
917947ffeb7c power pc version
kono
parents:
diff changeset
3458 printf(".text\n");
917947ffeb7c power pc version
kono
parents:
diff changeset
3459 } else {
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
3460 text_mode(0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3461 }
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3462 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",rrn,lb,code_base);
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3463 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
3464 if (d) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3465 printf("\tlfd %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3466 } else {
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3467 printf("\tlfs %s,0(%s)\n",frn,rrn);
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3468 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3469 free_register(r);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3470 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3471
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3472
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3473 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3474 code_dneg(int freg,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3475 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3476 char *frn;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3477 use_float(d,freg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3478 frn = fregister_name(freg);
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3479 printf("\tfneg %s,%s\n",frn,frn);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3480 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3481
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3482 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3483 code_d2i()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3484 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3485 char *frn;
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3486 char *crn;
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3487 int e2 = new_lvar(SIZE_OF_DOUBLE);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3488
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3489 use_double0();
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3490 frn = fregister_name(freg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3491 use_int0();
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3492 crn = register_name(creg);
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3493
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3494 free_lvar(e2);
93
8f5d61239b93 *** empty log message ***
kono
parents: 92
diff changeset
3495 printf("\tfctiwz %s,%s\n",frn,frn);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3496 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3497 printf("\tstfd %s,",frn); lvar(e2);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3498 lvar_intro(e2+SIZE_OF_DOUBLE-SIZE_OF_INT);
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
3499 printf("\tlwz %s,",crn); lvar(e2+SIZE_OF_DOUBLE-SIZE_OF_INT);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3500 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3501
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3502 static int i2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3503 static char *i2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3504 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3505 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3506 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3507 "__i2dLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3508 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3509 " .long -2147483648",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3510 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3511 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3512 "i2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3513 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3514 " bcl 20,31,__i2dL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3515 "__i2dL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3516 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3517 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3518 " xoris r3,r3,0x8000",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3519 " stw r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3520 " lis r0,0x4330",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3521 " stw r0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3522 " lfd f0,-32(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3523 " addis r9,r10,ha16(__i2dLC0-__i2dL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3524 " lfd f1,lo16(__i2dLC0-__i2dL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3525 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3526 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3527 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3528 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3529
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3530 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3531 code_i2d()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3532 {
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
3533 i2d_lib_used = 1;
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3534 clear_ptr_cache();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3535 code_save_stacks();
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3536 set_ireg(RET_REGISTER,1);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3537 printf("\tbl i2d_\n");
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
3538 set_freg(RET_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3539 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3540
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3541 static int d2u_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3542 static char *d2u_lib[] = {
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3543 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3544 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3545 "__d2uLC0:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3546 " .long 1105199104",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3547 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3548 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3549 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3550 "d2u_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3551 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3552 " bcl 20,31,__d2uL1$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3553 "__d2uL1$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3554 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3555 " mtlr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3556 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3557 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3558 " fcmpu cr0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3559 " cror 2,1,2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3560 " beq- cr0,__d2uL2",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3561 " fctiwz f0,f1",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3562 " stfd f0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3563 " lwz r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3564 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3565 "__d2uL2:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3566 " addis r9,r10,ha16(__d2uLC0-__d2uL1$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3567 " lfd f0,lo16(__d2uLC0-__d2uL1$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3568 " fsub f0,f1,f0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3569 " fctiwz f0,f0",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3570 " stfd f0,-24(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3571 " lwz r3,-20(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3572 " xoris r3,r3,0x8000",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3573 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3574 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3575 };
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3576
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3577 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3578 code_d2u()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3579 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3580 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3581 clear_ptr_cache();
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3582 d2u_lib_used=1;
104
c21aeb12b78b *** empty log message ***
kono
parents: 103
diff changeset
3583 set_freg(RET_FREGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3584 printf("\tbl d2u_\n");
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3585 set_ireg(RET_REGISTER,0);
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3586 }
90
07e3113c3c13 *** empty log message ***
kono
parents: 89
diff changeset
3587
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3588 static int u2d_lib_used=0;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3589 static char *u2d_lib[] = {
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3590 ".data",
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3591 /* ".literal8", */
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3592 " .align 3",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3593 "__u2dLC1:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3594 " .long 1127219200",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3595 " .long 0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3596 ".text",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3597 " .align 2",
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3598 "u2d_:",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3599 " mflr r0",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3600 " bcl 20,31,__u2dL2$pb",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3601 "__u2dL2$pb:",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3602 " mflr r10",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3603 " mtlr r0",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3604 " stw r3,-28(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3605 " lis r0,0x4330",
375
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3606 " stw r0,-32(r1)",
91849fdeea60 PowerPC large offset.
kono
parents: 371
diff changeset
3607 " lfd f0,-32(r1)",
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3608 " addis r9,r10,ha16(__u2dLC1-__u2dL2$pb)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3609 " lfd f1,lo16(__u2dLC1-__u2dL2$pb)(r9)",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3610 " fsub f1,f0,f1",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3611 " blr",
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3612 0
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3613 };
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3614
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3615 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3616 code_u2d()
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3617 {
113
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3618 code_save_stacks();
a9261154cde9 integer operation debug
kono
parents: 112
diff changeset
3619 clear_ptr_cache();
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3620 u2d_lib_used = 1;
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
3621 set_ireg(RET_REGISTER,1);
111
7aa449aff3e6 floating point
kono
parents: 110
diff changeset
3622 printf("\tbl u2d_\n");
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
3623 set_freg(RET_FREGISTER,0);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3624 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3625
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3626 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3627 code_d2f() { }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3628 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3629 code_f2d() { }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3630 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3631 code_f2i() { code_d2i(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3632 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3633 code_f2u() { code_d2u(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3634 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3635 code_i2f() { code_i2d(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3636 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3637 code_u2f() { code_u2d(); }
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3638
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3639 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3640 code_drgvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3641 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3642 use_float(d,freg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3643 code_ldf(fload(d),fregister_name(freg),cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3644 get_ptr_cache((NMTBL*)caddr(e2)));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3645 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3646
917947ffeb7c power pc version
kono
parents:
diff changeset
3647
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3648 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3649 code_drlvar(int e2,int d,int freg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3650 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3651 use_float(d,freg);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3652 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3653 printf("\t%s %s,",fload(d),fregister_name(freg)); lvar(e2);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3654 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3655
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3656 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3657 code_cmp_drgvar(int e2,int reg,int d,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3658 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3659 char *frn;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3660 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3661 char *grn=fregister_name(g);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3662
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3663 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3664 frn=fregister_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3665
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3666 code_ldf(fload(1),grn,cadr(e2),
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
3667 get_ptr_cache((NMTBL*)caddr(e2)));
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3668 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3669 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3670 free_register(g);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3671 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3672 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3673
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3674 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3675 code_cmp_drlvar(int e2,int reg,int d,int label,int cond)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3676 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3677 char *frn;
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3678 int g=get_dregister(d);
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3679 char *grn=fregister_name(g);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3680
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3681 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3682 frn=fregister_name(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3683
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3684 lvar_intro(e2);
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3685 printf("\t%s %s,",fload(1),grn); lvar(e2);
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3686 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3687 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3688 free_register(g);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
3689 jcond(label,cond);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3690 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3691
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3692 void
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3693 dtosop(int op,int reg,int oreg)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3694 {
127
eb4d8975926c Intel float fix
kono
parents: 126
diff changeset
3695 char *opn="";
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3696 char *frn;
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3697 char *grn;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3698 int ox = -1;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3699
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3700 use_float(1,reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3701 if(oreg==-1) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3702 error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3703 } else if (oreg<= -REG_LVAR_OFFSET) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3704 ox = get_dregister(1); if (ox<0) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3705 use_reg(ox);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3706 code_drlvar(oreg+REG_LVAR_OFFSET,1,ox);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3707 oreg = ox;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3708 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3709 grn=fregister_name(oreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3710 frn=fregister_name(reg);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3711 switch(op) {
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3712 case FADD:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3713 case DADD: opn="fadd"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3714 case FSUB:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3715 case DSUB: opn="fsub"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3716 case FDIV:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3717 case DDIV: opn="fdiv"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3718 case FMUL:
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3719 case DMUL: opn="fmul"; break;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3720 case FCMP:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3721 case DCMP:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3722 inc_cmpflag();
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3723 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3724 if (ox!=-1) free_register(ox);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3725 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3726 case FCMPGE:
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3727 case DCMPGE:
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
3728 inc_cmpflag();
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3729 printf("\tfcmpu cr%d,%s,%s\n",cmpflag,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3730 if (ox!=-1) free_register(ox);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
3731 return;
133
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3732 default:
7d436c08e949 separate float / double flow
kono
parents: 132
diff changeset
3733 error(-1); return;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3734 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3735 printf("\t%s %s,%s,%s\n",opn,frn,frn,grn);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3736 if (ox!=-1) free_register(ox);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3737 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3738
917947ffeb7c power pc version
kono
parents:
diff changeset
3739 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3740 code_dassop(int op,int reg,int d) {
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3741 /* we have lvalue in creg, applied floating value is in freg */
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3742 // (*creg) op = pop()
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3743 int xreg=emit_dpop(d);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3744 char *crn;
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
3745 char *frn;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3746
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3747 crn=register_name(ireg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3748 use_float(d,reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3749 frn =fregister_name(reg);
209
7bfc1435cdc6 regv fix done
kono
parents: 208
diff changeset
3750
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3751 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3752 dtosop(op,reg,xreg);
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
3753 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3754 emit_dpop_free(xreg,d);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3755 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3756
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3757 void
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3758 code_register_dassop(int reg,int op,int d) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3759 // reg op= dpop()
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3760 int xreg=emit_dpop(d);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3761 dtosop(op,reg,xreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3762 emit_dpop_free(xreg,d);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3763 }
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3764
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3765 static int
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3766 code_dload_1(int d)
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3767 {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3768 int r,g;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3769 char *drn,*grn;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3770 // load 1
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3771 float_one_lib_used=1;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3772 r = get_ptr_cache(&float_one);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3773 drn=register_name(r);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3774 grn=fregister_name(g=get_dregister(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3775 printf("\tlfs %s,0(%s)\n",grn,drn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3776 return g;
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3777 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3778
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3779 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
3780 code_dpreinc(int e1,int e2,int d,int reg) {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3781 char *frn,*crn,*grn;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3782 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3783
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
3784 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3785 crn=register_name(cadr(e2));
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3786 grn = fregister_name(g = code_dload_1(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3787 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3788 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3789 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3790 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3791 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3792 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",crn,crn,grn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3793 if (use && reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3794 printf("\tfmr %s,%s\n",frn,crn);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3795 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3796 g_expr(e2);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3797 if (!is_int_reg(creg)) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3798 crn=register_name(ireg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3799 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3800 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3801 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3802 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3803 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3804 grn = fregister_name(g = code_dload_1(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3805 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3806 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",frn,frn,grn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3807 printf("\t%s %s,0(%s)\n",fstore(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3808 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3809 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3810 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3811
917947ffeb7c power pc version
kono
parents:
diff changeset
3812 void
107
06f72222d6b5 prevent destorying function argument (incomeplete)
kono
parents: 106
diff changeset
3813 code_dpostinc(int e1,int e2,int d,int reg) {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3814 char *frn,*crn,*grn;
91
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3815 int g;
9b1aeb62e0b9 powerpc continue... (floating point)
kono
parents: 90
diff changeset
3816
144
56211702f298 creg/freg continue
kono
parents: 141
diff changeset
3817 if (car(e2)==DREGISTER||car(e2)==FREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3818 crn=register_name(cadr(e2));
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3819 grn = fregister_name(g = code_dload_1(d));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3820 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3821 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3822 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3823 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3824 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3825 if (use && reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3826 printf("\tfmr %s,%s\n",frn,crn);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3827 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
3828 } else {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3829 g_expr(e2);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3830 if (!is_int_reg(creg)) error(-1);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3831 crn=register_name(ireg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3832 if (reg==USE_CREG) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3833 reg=get_dregister(d); if (!reg) error(-1);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3834 set_freg(reg,0);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3835 }
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3836 frn=fregister_name(reg);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
3837 grn = fregister_name(g = code_dload_1(d));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3838 printf("\t%s %s,0(%s)\n",fload(d),frn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3839 printf("\t%s %s,%s,%s\n",(caddr(e1)>0)?"fadd":"fsub",grn,frn,grn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3840 printf("\t%s %s,0(%s)\n",fstore(d),grn,crn);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3841 }
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3842 free_register(g);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3843 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3844
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3845 static int
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3846 drexpr_bool(int e1,int reg)
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3847 {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3848 int flag=-1,eq=-1,neg=-1,t;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3849 char *rn;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3850 switch(car(e1)) {
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3851 case DOP+GT: case FOP+GT: flag = 2; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3852 case DOP+GE: case FOP+GE: flag = 2; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3853 case DOP+LT: case FOP+LT: flag = 1; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3854 case DOP+LE: case FOP+LE: flag = 1; eq=3; break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3855 case DOP+EQ: case FOP+EQ: flag = 3; break;
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3856 case DOP+NEQ: case FOP+NEQ: flag = 3; neg=3; break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3857 default: return 0;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3858 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3859 g_expr(list3(DCMP,cadr(e1),caddr(e1)));
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3860 use_int(reg);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3861 rn = register_name(reg);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3862 t = CRBITSIZ*cmpflag;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3863 if (eq>0) {
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3864 printf("\tcror %d,%d,%d\n",t+flag-1,t+eq-1,t+flag-1);
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3865 }
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3866 if (neg>0) {
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3867 neg = t+neg-1,
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3868 printf("\tcrnor %d,%d,%d\n",neg,neg,neg);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3869 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3870 printf("\tmfcr %s\n",rn);
289
55e611476cba *** empty log message ***
kono
parents: 288
diff changeset
3871 printf("\trlwinm %s,%s,%d,1\n",rn,rn,t+flag);
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3872 return 1;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3873 }
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3874
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3875 int
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3876 drexpr(int e1, int e2,int l1, int op,int cond)
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3877 {
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
3878 if (!cond) {
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3879 switch(op) {
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3880 case FOP+GT:
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3881 return drexpr(e2,e1,l1,FOP+GE,1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3882 case FOP+GE:
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3883 return drexpr(e2,e1,l1,FOP+GT,1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3884 case FOP+EQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3885 op=FOP+NEQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3886 case FOP+NEQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3887 op=FOP+EQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3888 case DOP+GT:
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3889 return drexpr(e2,e1,l1,DOP+GE,1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3890 case DOP+GE:
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3891 return drexpr(e2,e1,l1,DOP+GT,1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3892 case DOP+EQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3893 op=DOP+NEQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3894 case DOP+NEQ:
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3895 op=DOP+EQ; break;
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3896 }
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3897 }
234
eccea7c904ee float powerpc drexp done (?)
kono
parents: 233
diff changeset
3898 g_expr(list3(DCMP, e1,e2));
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3899 switch(op) {
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3900 case DOP+GT: case FOP+GT:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3901 printf("\tbgt\tcr%d,L_%d\n",cmpflag,l1);
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3902 break;
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3903 case DOP+GE: case FOP+GE:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3904 printf("\tbge\tcr%d,L_%d\n",cmpflag,l1);
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3905 break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3906 case DOP+EQ: case FOP+EQ:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3907 printf("\tbeq\tcr%d,L_%d\n",cmpflag,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3908 break;
288
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3909 case DOP+NEQ: case FOP+NEQ:
ce7b4d90bc24 PowerPC code bool
kono
parents: 287
diff changeset
3910 printf("\tbne\tcr%d,L_%d\n",cmpflag,l1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3911 break;
917947ffeb7c power pc version
kono
parents:
diff changeset
3912 }
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3913 return l1;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3914 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3915
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3916 int emit_dpop(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3917 {
114
e6cb1e293b35 float/int passed.
kono
parents: 113
diff changeset
3918 int xreg,reg;
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3919 xreg=pop_fregister();
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3920 if (xreg<= -REG_LVAR_OFFSET) {
138
e6e77af048a1 float/dobule configuration
kono
parents: 137
diff changeset
3921 reg = get_dregister(d);
119
b815fcd57b9d input var ( incomplete )
kono
parents: 118
diff changeset
3922 code_drlvar(REG_LVAR_OFFSET+xreg,1,reg);
117
2d5a203cc3a6 lvar reuse
kono
parents: 116
diff changeset
3923 free_lvar(REG_LVAR_OFFSET+xreg);
205
a50f90d0b63a *** empty log message ***
kono
parents: 204
diff changeset
3924 xreg=reg;
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3925 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
3926 return xreg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3927 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3928
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3929 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3930 emit_dpop_free(int e1,int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3931 {
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3932 free_register(e1);
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3933 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3934
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3935 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3936 emit_dpush(int d)
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3937 {
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3938 int new_reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3939 if (!is_float_reg(creg)) error(-1);
102
3cf2f8c120b9 *** empty log message ***
kono
parents: 101
diff changeset
3940 if (freg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3941 new_reg = get_dregister(1); /* ���Ф˼��� */
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
3942 freg_stack[freg_sp++] = freg; /* push ���뤫���˥쥸������Ȥ� */
147
cb7aa0089681 creg/ireg done for powerpc.
kono
parents: 145
diff changeset
3943 creg = freg = new_reg;
89
917947ffeb7c power pc version
kono
parents:
diff changeset
3944 }
917947ffeb7c power pc version
kono
parents:
diff changeset
3945
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3946 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3947
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3948 #if LONGLONG_CODE
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3949
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3950
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3951 /* 64bit int part */
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3952 static void
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
3953 lmove(int to,int from) // to <= from
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3954 {
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3955 int tmp;
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3956 if (regv_h(to)==regv_l(from)&&(regv_l(to)==regv_h(from))) {
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3957 tmp = get_register();
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
3958 printf("\tmr %s,%s\n",register_name(tmp),lregister_name_low(from));
227
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3959 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3960 printf("\tmr %s,%s\n",lregister_name_low(to),register_name(tmp));
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3961 free_register(tmp);
ed92cef127f1 *** empty log message ***
kono
parents: 226
diff changeset
3962 } else if (regv_h(to)==regv_l(from)) {
226
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3963 printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3964 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3965 } else {
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3966 printf("\tmr %s,%s\n",lregister_name_high(to),lregister_name_high(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3967 printf("\tmr %s,%s\n",lregister_name_low(to),lregister_name_low(from));
a31e1d24c097 *** empty log message ***
kono
parents: 223
diff changeset
3968 }
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
3969 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3970
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
3971 static void
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3972 pcond(char *s,int cmpflag,int l1)
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3973 {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3974 printf("\tb%s cr%d,L_%d\n",s,cmpflag,l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3975 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3976
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3977 static int
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3978 lcmp(int op,int cond)
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3979 {
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3980 if (op==LOP+UGT||op==LOP+UGE) {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3981 return UCMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3982 } else if (op==LOP+LE||op==LOP+GE) {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3983 return CMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3984 } else {
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3985 return CMP;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3986 }
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3987 }
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3988
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
3989 int
229
d793c84b3679 *** empty log message ***
kono
parents: 228
diff changeset
3990 lrexpr(int e1, int e2,int l1, int op,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
3991 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
3992 int reg;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3993 int e3;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3994 int l2;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3995 int op1,cr0,cr1;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
3996
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3997 g_expr(e1);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3998 emit_lpush();
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
3999 g_expr(e2);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4000 e3 = emit_lpop();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4001 if (!is_longlong_reg(creg)) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4002 reg = lreg;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4003 op1 = lcmp(op,cond);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4004 tosop(op1,regv_h(e3),regv_h(reg));
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4005 cr0 = cmpflag;
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
4006 tosop(op1,regv_l(e3),regv_l(reg));
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4007 cr1 = cmpflag;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4008
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4009 l2 = fwdlabel();
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4010 // cond==0 jump on false condtion ( if(x) => rexpr(.. cond=0 ...) )
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4011 switch(op+(!cond)*BNOT) {
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4012 case LOP+GT:
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4013 case LOP+GE:
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4014 pcond(code_gt(1),cr0,1?l1:l2);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4015 pcond(code_eq(0),cr0,1?l2:l1);
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4016 break;
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4017 case LOP+UGT:
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4018 case LOP+UGE:
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4019 pcond(code_ugt(1),cr0,1?l1:l2);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4020 pcond(code_eq(0), cr0,1?l2:l1);
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4021 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4022 case LOP+EQ:
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4023 pcond(code_eq(0),cr0,(1?l2:l1));
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4024 pcond(code_eq(cond),cr1,l1);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4025 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4026 case LOP+NEQ:
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4027 pcond(code_eq(0),cr0,(1?l1:l2));
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4028 pcond(code_eq(!1),cr1,l1);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4029 break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4030 case LOP+GT+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4031 case LOP+GE+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4032 pcond(code_gt(1),cr0,0?l1:l2);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4033 pcond(code_eq(0),cr0,0?l2:l1);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4034 break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4035 case LOP+UGT+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4036 case LOP+UGE+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4037 pcond(code_ugt(1),cr0,0?l1:l2);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4038 pcond(code_eq(0), cr0,0?l2:l1);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4039 break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4040 case LOP+EQ+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4041 pcond(code_eq(0),cr0,(0?l2:l1));
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4042 pcond(code_eq(0),cr1,l1);
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4043 break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4044 case LOP+NEQ+BNOT:
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4045 pcond(code_eq(0),cr0,(0?l1:l2));
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4046 pcond(code_eq(!0),cr1,l1);
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4047 break;
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4048 default:
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4049 error(-1);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4050 }
433
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4051 switch(op+BNOT*(!cond)) {
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4052 case LOP+GT: pcond(code_gt(1), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4053 case LOP+GE: pcond(code_ge(1), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4054 case LOP+UGT: pcond(code_ugt(1), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4055 case LOP+UGE: pcond(code_uge(1), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4056 case LOP+GT+BNOT: pcond(code_gt(0), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4057 case LOP+GE+BNOT: pcond(code_ge(0), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4058 case LOP+UGT+BNOT: pcond(code_ugt(0), cr1,l1); break;
b9566a04b6e2 *** empty log message ***
kono
parents: 432
diff changeset
4059 case LOP+UGE+BNOT: pcond(code_uge(0), cr1,l1); break;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4060 }
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4061 fwddef(l2);
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4062 emit_lpop_free(e3);
438
626d705471d5 Unexecuted code in conditional. Lazy jmp code generation.
kono
parents: 436
diff changeset
4063 return l1;
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4064 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4065
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4066 int
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4067 emit_lpop()
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4068 {
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4069 int xreg,reg;
237
1933266f1efa long long ia32 (imcomplete)
kono
parents: 234
diff changeset
4070 xreg=lreg_stack[--lreg_sp];
210
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4071 if (xreg<= -REG_LVAR_OFFSET) {
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4072 reg = get_lregister();
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4073 code_lrlvar(REG_LVAR_OFFSET+xreg,reg);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4074 free_lvar(REG_LVAR_OFFSET+xreg);
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4075 xreg = reg;
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4076 }
f21651f85344 *** empty log message ***
kono
parents: 209
diff changeset
4077 return xreg;
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4078 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4079
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4080 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4081 code_lregister(int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4082 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4083 use_longlong(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4084 if (reg!=e2) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4085 lmove(reg,e2);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4086 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4087 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4088
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4089 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4090 code_cmp_lregister(int reg,int label,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4091 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4092 use_longlong(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4093 printf("\tor %s,%s,%s\n",
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4094 lregister_name_low(reg),
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4095 lregister_name_low(reg),
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4096 lregister_name_high(reg));
291
7b6df595b205 ia32 code_bool.
kono
parents: 289
diff changeset
4097 inc_cmpflag();
280
affb054fe920 lrexpr fix. rexpr in MIPS fix.
kono
parents: 273
diff changeset
4098 printf("\tcmpwi cr%d,%s,0\n",cmpflag,lregister_name_low(reg));
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4099 jcond(label,cond);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4100 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4101
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4102 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4103 code_cmp_lrgvar(int e1,int creg,int label,int cond)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4104 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4105 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4106 code_lrgvar(e1,creg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4107 code_cmp_lregister(creg,label,cond);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4108 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4109
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4110 void
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4111 code_cmp_lrlvar(int e1,int creg,int label,int cond)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4112 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4113 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4114 code_lrlvar(e1,creg);
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4115 code_cmp_lregister(creg,label,cond);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4116 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4117
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4118 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4119 code_lassign(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4120 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4121 char *drn = register_name(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4122 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4123 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4124
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4125 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4126 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4127 crn_l = lregister_name_low(creg);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4128 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4129 printf("\tstw %s,0(%s)\n",crn_l,drn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4130 printf("\tstw %s,%d(%s)\n",crn_h,SIZE_OF_INT,drn);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4131 #else
271
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
4132 printf("\tstw %s,0(%s)\n",crn_h,drn);
e1a96bdbe527 MIPS continue...
kono
parents: 269
diff changeset
4133 printf("\tstw %s,%d(%s)\n",crn_l,SIZE_OF_INT,drn);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4134 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4135 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4136
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4137 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4138 code_lassign_gvar(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4139 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4140 int r;
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4141 use_longlong(creg);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4142 r = get_ptr_cache((NMTBL*)caddr(e2));
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4143 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4144 code_ldf(cstore(0),lregister_name_low(creg),cadr(e2),r);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4145 code_ldf(cstore(0),lregister_name_high(creg),cadr(e2)+SIZE_OF_INT,r);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4146 #else
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4147 code_ldf(cstore(0),lregister_name_high(creg),cadr(e2),r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4148 code_ldf(cstore(0),lregister_name_low(creg),cadr(e2)+SIZE_OF_INT,r);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4149 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4150 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4151
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4152 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4153 code_lassign_lvar(int e2,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4154 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4155 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4156 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4157
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4158 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4159 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4160 crn_l = lregister_name_low(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4161 lvar_intro(e2);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4162 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4163 printf("\tstw %s,",crn_l);lvar(e2);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4164 printf("\tstw %s,",crn_h);lvar(e2+SIZE_OF_INT);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4165 #else
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4166 printf("\tstw %s,",crn_h);lvar(e2);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4167 printf("\tstw %s,",crn_l);lvar(e2+SIZE_OF_INT);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4168 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4169 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4170
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4171 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4172 code_lassign_lregister(int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4173 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4174 use_longlong(reg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4175 if (e2!=reg) {
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4176 lmove(e2,reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4177 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4178 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4179
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4180 static long long ll0 = 1LL;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4181
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4182 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4183 code_l1(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4184 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4185 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4186 return (i[1] == 1)?j[1]:j[0];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4187 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4188
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4189 static int
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4190 code_l2(long long d)
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4191 {
207
8a3516f6eb66 *** empty log message ***
kono
parents: 206
diff changeset
4192 int *i = (int *)&ll0; int *j = (int *)&d;
206
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4193 return (i[1] == 1)?j[0]:j[1];
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4194 }
4170cefb48f6 *** empty log message ***
kono
parents: 205
diff changeset
4195
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4196 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4197 code_lconst(int e1,int creg)
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4198 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4199 use_longlong(creg);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4200 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4201 code_const(code_l1(lcadr(e1)),regv_h(creg));
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4202 code_const(code_l2(lcadr(e1)),regv_l(creg));
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4203 #else
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4204 code_const(code_l1(lcadr(e1)),regv_l(creg));
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4205 code_const(code_l2(lcadr(e1)),regv_h(creg));
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4206 #endif
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4207 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4208
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4209 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4210 code_lneg(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4211 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4212 use_longlong(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4213 printf("\tsubfic %s,%s,0\n",
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4214 lregister_name_low(creg),lregister_name_low(creg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4215 printf("\tsubfze %s,%s\n",
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4216 lregister_name_high(creg),lregister_name_high(creg));
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4217 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4218
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4219 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4220 code_lrgvar(int e1,int creg)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4221 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4222 int r;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4223 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4224 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4225 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4226 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4227 crn_l = lregister_name_low(creg);
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4228 r = get_ptr_cache((NMTBL*)caddr(e1));
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4229 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4230 code_ldf(cload(0),crn_l,cadr(e1),r);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4231 code_ldf(cload(0),crn_h,cadr(e1)+SIZE_OF_INT,r);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4232 #else
367
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4233 code_ldf(cload(0),crn_h,cadr(e1),r);
4efbb07f556b global variable offset
kono
parents: 366
diff changeset
4234 code_ldf(cload(0),crn_l,cadr(e1)+SIZE_OF_INT,r);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4235 #endif
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4236 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4237
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4238 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4239 code_lrlvar(int e1,int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4240 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4241 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4242 char *crn_l;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4243 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4244 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4245 crn_l = lregister_name_low(creg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4246 lvar_intro(e1);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4247 #if ENDIAN_L==0
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4248 printf("\tlwz %s,",crn_l); lvar(e1);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4249 printf("\tlwz %s,",crn_h); lvar(e1+SIZE_OF_INT);
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4250 #else
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4251 printf("\tlwz %s,",crn_h); lvar(e1);
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
4252 printf("\tlwz %s,",crn_l); lvar(e1+SIZE_OF_INT);
411
32c1914308db ENDIAN_L ENDIAN_D
kono
parents: 408
diff changeset
4253 #endif
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4254 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4255
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4256 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4257 static int lumod_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4258 static char *lumod_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4259 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4260
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4261 static int lmod_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4262 static char *lmod_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4263 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4264
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4265 static int ludiv_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4266 static char *ludiv_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4267 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4268
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4269 static int ldiv_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4270 static char *ldiv_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4271 };
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4272 #endif
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4273
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4274 static int lsrd_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4275 static char *lsrd_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4276 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4277 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4278 "lsrd__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4279 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4280 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4281 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4282 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4283 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4284 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4285 " bgt+ cr7,L__lsrd1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4286 " neg r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4287 " lwz r2,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4288 " li r9,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4289 " srw r2,r2,r0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4290 " stw r9,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4291 " b L__lsrd2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4292 "L__lsrd1: lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4293 " slw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4294 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4295 " srw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4296 " srw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4297 " stw r0,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4298 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4299 "L__lsrd2: stw r2,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4300 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4301 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4302 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4303 0
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4304 };
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4305
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4306 static int asld_lib_used=0;
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4307 static char *asld_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4308 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4309 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4310 "asld__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4311 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4312 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4313 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4314 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4315 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4316 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4317 " bgt+ cr7,L__asld1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4318 " neg r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4319 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4320 " li r9,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4321 " slw r2,r2,r0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4322 " stw r9,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4323 " b L__asld2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4324 "L__asld1: lwz r0,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4325 " srw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4326 " lwz r2,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4327 " slw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4328 " slw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4329 " stw r0,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4330 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4331 "L__asld2: stw r2,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4332 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4333 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4334 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4335 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4336 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4337
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4338 static int asrd_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4339 static char *asrd_lib[] = {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4340 ".text",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4341 " .align 2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4342 "asrd__:",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4343 " mr. r5,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4344 " beqlr",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4345 " subfic r2,r5,32",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4346 " stw r3,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4347 " stw r4,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4348 " cmpwi cr7,r2,0",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4349 " bgt+ cr7,L__asrd1",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4350 " lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4351 " neg r2,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4352 " sraw r2,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4353 " srawi r0,r0,31",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4354 " b L__asrd2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4355 "L__asrd1: lwz r0,-32(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4356 " slw r9,r0,r2",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4357 " lwz r2,-28(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4358 " sraw r0,r0,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4359 " srw r2,r2,r5",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4360 " or r2,r2,r9",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4361 "L__asrd2: stw r0,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4362 " stw r2,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4363 " lwz r3,-48(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4364 " lwz r4,-44(r1)",
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4365 " blr",
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4366 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4367 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4368
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4369 static void
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4370 extern_conv(char *conv)
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4371 {
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4372 code_save_stacks();
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4373 clear_ptr_cache();
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4374 extern_define(conv,0,FUNCTION,1);
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4375 printf("\tbl L_%s$stub\n",conv);
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4376 }
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4377
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4378 #if FLOAT_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4379 #if 0
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4380 static int d2ll_lib_used=0;
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4381 static char *d2ll_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4382 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4383
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4384 static int d2ull_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4385 static char *d2ull_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4386 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4387
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4388 static int f2ll_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4389 static char *f2ll_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4390 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4391
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4392 static int f2ull_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4393 static char *f2ull_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4394 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4395
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4396 static int ll2d_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4397 static char *ll2d_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4398 };
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4399
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4400 static int ll2f_lib_used=0;
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4401 static char *ll2f_lib[] = {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4402 };
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4403 #endif
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4404
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4405 #endif
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4406
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4407 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4408 code_asld_lib(int reg,int oreg)
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4409 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4410 code_save_stacks();
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4411 clear_ptr_cache();
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4412 asld_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4413 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4414 set_lreg(RET_LREGISTER,0);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4415 if (regv_l(oreg)!=5) {
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4416 printf("\tmr r5,%s\n", lregister_name_low(oreg));
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4417 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4418 printf("\tbl asld__\n");
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4419 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4420
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4421 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4422 code_asrd_lib(int reg,int oreg) // ___ashrdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4423 {
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4424 code_save_stacks();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4425 clear_ptr_cache();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4426 asrd_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4427 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4428 set_lreg(RET_LREGISTER,0);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4429 if (regv_l(oreg)!=5) {
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4430 printf("\tmr r5,%s\n", lregister_name_low(oreg));
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4431 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4432 printf("\tbl asrd__\n");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4433 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4434
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4435 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4436 code_lsrd_lib(int reg,int oreg) // ___lshrdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4437 {
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4438 code_save_stacks();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4439 clear_ptr_cache();
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4440 lsrd_lib_used = 1;
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4441 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4442 set_lreg(RET_LREGISTER,0);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4443 if (regv_l(oreg)!=5) {
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4444 printf("\tmr r5,%s\n", lregister_name_low(oreg));
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4445 }
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4446 printf("\tbl lsrd__\n");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4447 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4448
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4449 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4450 code_ldiv_lib(int reg,int oreg) // ___divdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4451 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4452 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4453 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4454 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4455 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4456 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4457 extern_conv("__divdi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4458 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4459
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4460 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4461 code_ludiv_lib(int reg,int oreg) // ___udivdi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4462 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4463 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4464 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4465 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4466 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4467 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4468 extern_conv("__udivdi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4469 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4470
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4471 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4472 code_lmod_lib(int reg,int oreg) // ___moddi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4473 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4474 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4475 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4476 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4477 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4478 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4479 extern_conv("__moddi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4480 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4481
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4482 static void
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4483 code_lumod_lib(int reg,int oreg) // ___umoddi3$stub
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4484 {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4485 code_save_stacks();
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4486 clear_ptr_cache();
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4487 set_lreg(RET_LREGISTER,0);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4488 set_lreg_operand(reg,1);
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4489 set_lreg_operand1(oreg,1);
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4490 extern_conv("__umoddi3");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4491 }
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4492
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
4493 #define check_lreg(reg) if (reg!=lreg) { lmove(reg,lreg); /* reg<=lreg */ }
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
4494
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
4495 // reg = reg op oreg
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4496
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4497 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4498 ltosop(int op,int reg,int oreg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4499 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4500 int dx = -1;
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4501 int ox = -1;
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
4502 int creg_mode = (reg==USE_CREG);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4503 char *orn_h,*crn_h,*drn_h;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4504 char *orn_l,*crn_l,*drn_l;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4505 // creg = creg op oreg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4506
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4507 use_longlong(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4508 if(oreg==-1) {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4509 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4510 } else if (oreg<= -REG_LVAR_OFFSET) {
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4511 ox = get_lregister(); if (ox<0) error(-1);
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4512 use_reg(ox);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4513 code_lrlvar(oreg+REG_LVAR_OFFSET,ox);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4514 oreg = ox;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4515 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4516
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4517 switch(op) {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4518 case LLSHIFT:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4519 case LULSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4520 code_asld_lib(reg,oreg); // ___ashldi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4521 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4522 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4523 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4524 case LRSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4525 code_asrd_lib(reg,oreg); // ___ashrdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4526 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4527 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4528 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4529 case LURSHIFT:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4530 code_lsrd_lib(reg,oreg); // ___lshrdi3$stub
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4531 check_lreg(reg);
252
1452eb0eab20 *** empty log message ***
kono
parents: 246
diff changeset
4532 if(ox!=-1) free_register(ox);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4533 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4534 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4535 orn_h = lregister_name_high(oreg);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4536 orn_l = lregister_name_low(oreg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4537 crn_h = lregister_name_high(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4538 crn_l = lregister_name_low(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4539 switch(op) {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4540 case LADD:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4541 printf("\taddc %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4542 printf("\tadde %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4543 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4544 case LSUB:
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4545 printf("\tsubfc %s,%s,%s\n",crn_l,orn_l,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4546 printf("\tsubfe %s,%s,%s\n",crn_h,orn_h,crn_h);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4547 break;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4548 case LCMP:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4549 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4550 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4551 case LBAND:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4552 printf("\tand %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4553 printf("\tand %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4554 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4555 case LEOR:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4556 printf("\txor %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4557 printf("\txor %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4558 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4559 case LBOR:
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4560 printf("\tor %s,%s,%s\n",crn_l,crn_l,orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4561 printf("\tor %s,%s,%s\n",crn_h,crn_h,orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4562 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4563 case LMUL:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4564 case LUMUL:
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4565 // code_save_stacks();
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4566 // clear_ptr_cache();
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
4567 dx=get_lregister(); if (dx<0) error(-1);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4568 use_reg(dx);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4569 drn_l = lregister_name_low(dx);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4570 drn_h = lregister_name_high(dx);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4571 /*
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4572 drn_l = l32( crn_l * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4573 drn_h = h32( crn_l * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4574 orn_l = l32( crn_h * orn_l);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4575 drn_h = drn_h + orn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4576 crn_l = l32( crn_l * orn_h);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4577 crn_h = drn_h + crn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4578 crn_l = drn_l;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4579 */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4580 printf("\tmulhwu %s,%s,%s\n",drn_h,crn_l,orn_l);
228
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4581 printf("\tmullw %s,%s,%s\n", drn_l,crn_l,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4582 printf("\tmullw %s,%s,%s\n", orn_l,crn_h,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4583 printf("\tadd %s,%s,%s\n", drn_h,drn_h,orn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4584 printf("\tmullw %s,%s,%s\n", crn_l,orn_h,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4585 printf("\tadd %s,%s,%s\n", crn_h,drn_h,crn_l);
21b311266011 *** empty log message ***
kono
parents: 227
diff changeset
4586 printf("\tmr %s,%s\n", crn_l,drn_l);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4587 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4588 case LDIV:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4589 code_ldiv_lib(reg,oreg); // ___divdi3$stub
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
4590 if (!creg_mode) check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4591 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4592 case LUDIV:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4593 code_ludiv_lib(reg,oreg); // ___udivdi3$stub
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
4594 if (!creg_mode) check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4595 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4596 case LMOD:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4597 code_lmod_lib(reg,oreg); // ___moddi3$stub
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
4598 if (!creg_mode) check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4599 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4600 case LUMOD:
255
8cd8d72286ae PowerPC long long complex function call fix.
kono
parents: 252
diff changeset
4601 code_lumod_lib(reg,oreg); // ___umoddi3$stub
531
19f5882997f5 *** empty log message ***
kono
parents: 530
diff changeset
4602 if (!creg_mode) check_lreg(reg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4603 break;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4604 default:
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4605 error(-1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4606 }
530
58aceee8e4b4 get_lregister messed up
kono
parents: 529
diff changeset
4607 if(ox!=-1) free_register(ox);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4608 if(dx!=-1) free_register(dx);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4609 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4610
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4611 int
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4612 code_lconst_op_p(int op,int e)
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4613 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4614 int v;
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4615 if (car(e)==LCONST) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4616 if (!(-32766<lcadr(e)&&lcadr(e)<32767)) return 0;
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4617 v = lcadr(e);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4618 } else if (car(e)==CONST) {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4619 if (!(-32766<cadr(e)&&cadr(e)<32767)) return 0;
287
a0779a414855 *** empty log message ***
kono
parents: 285
diff changeset
4620 v = cadr(e);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4621 } else return 0;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4622
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4623 switch(op) {
436
kono
parents: 435
diff changeset
4624 case LMUL: case LUMUL: case LUDIV:
kono
parents: 435
diff changeset
4625 // case LDIV:
kono
parents: 435
diff changeset
4626 return ilog(v);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4627 case LLSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4628 case LULSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4629 case LRSHIFT:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4630 case LURSHIFT:
435
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4631 return (0<=v&&v<=64);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4632 case LADD:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4633 case LSUB:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4634 return 1;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4635 case LBOR:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4636 return (v>0);
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4637 default:
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4638 return 0;
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4639 }
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4640 }
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4641
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4642 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4643 loprtc(int op,int creg,int e)
213
kono
parents: 212
diff changeset
4644 {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4645 char *crn_h;
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4646 char *crn_l;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4647 char *grn;
214
4f459364c334 *** empty log message ***
kono
parents: 213
diff changeset
4648 int v;
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4649 int greg;
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4650
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4651 use_longlong(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4652 crn_h = lregister_name_high(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4653 crn_l = lregister_name_low(creg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4654
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4655 if (car(e)==LCONST) v = lcadr(e);
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4656 else if (car(e)==CONST) v = cadr(e);
213
kono
parents: 212
diff changeset
4657
kono
parents: 212
diff changeset
4658 switch(op) {
436
kono
parents: 435
diff changeset
4659 case LMUL: case LUMUL:
kono
parents: 435
diff changeset
4660 v=ilog(v);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4661 case LLSHIFT:
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4662 case LULSHIFT:
435
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4663 if (v==0) return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4664 if (v==32) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4665 code_register(regv_l(creg),regv_h(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4666 code_const(0,regv_l(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4667 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4668 } else if (v>31) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4669 printf("\tslwi %s,%s,%d\n",crn_h,crn_l,v-32);
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4670 code_const(0,regv_l(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4671 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4672 }
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4673 greg = get_register();
435
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4674 grn = register_name(greg);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4675 use_reg(greg);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4676 printf("\tsrwi %s,%s,%d\n",grn,crn_l,32-v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4677 printf("\tslwi %s,%s,%d\n",crn_h,crn_h,v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4678 printf("\tor %s,%s,%s\n",crn_h,grn,crn_h);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4679 printf("\tslwi %s,%s,%d\n",crn_l,crn_l,v);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4680 free_register(greg);
213
kono
parents: 212
diff changeset
4681 return;
436
kono
parents: 435
diff changeset
4682 case LDIV:
kono
parents: 435
diff changeset
4683 v=ilog(v);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4684 case LRSHIFT:
435
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4685 if (v==0) return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4686 if (v==32) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4687 code_register(regv_h(creg),regv_l(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4688 printf("\tsrawi %s,%s,31\n",crn_h,crn_l);
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4689 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4690 } else if (v>31) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4691 printf("\tsrawi %s,%s,%d\n",crn_l,crn_h,v-32);
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4692 printf("\tsrawi %s,%s,31\n",crn_h,crn_l);
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4693 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4694 }
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4695 greg = get_register();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4696 use_reg(greg);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4697 grn = register_name(greg);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4698 printf("\tsrwi %s,%s,%d\n",grn,crn_l,v);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4699 printf("\tinsrwi %s,%s,%d,0\n",grn,crn_h,v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4700 printf("\tsrawi %s,%s,%d\n",crn_h,crn_h,v);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4701 printf("\tmr %s,%s\n",crn_l,grn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4702 free_register(greg);
213
kono
parents: 212
diff changeset
4703 return;
436
kono
parents: 435
diff changeset
4704 case LUDIV:
kono
parents: 435
diff changeset
4705 v=ilog(v);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4706 case LURSHIFT:
435
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4707 if (v==0) return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4708 if (v==32) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4709 code_register(regv_h(creg),regv_l(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4710 code_const(0,regv_h(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4711 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4712 } else if (v>31) {
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4713 printf("\tsrwi %s,%s,%d\n",crn_l,crn_h,v-32);
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4714 code_const(0,regv_h(creg));
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4715 return;
d3e6359f8501 loprtc LLSHIFT....
kono
parents: 433
diff changeset
4716 }
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4717 greg = get_register();
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4718 use_reg(greg);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4719 grn = register_name(greg);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4720 printf("\tslwi %s,%s,%d\n",grn,crn_h,32-v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4721 printf("\tsrwi %s,%s,%d\n",crn_l,crn_l,v);
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4722 printf("\tor %s,%s,%s\n",crn_l,grn,crn_l);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4723 printf("\tsrwi %s,%s,%d\n",crn_h,crn_h,v);
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4724 free_register(greg);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4725 return;
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4726 case LSUB:
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4727 v = -v;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4728 case LADD:
231
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4729 printf("\taddic %s,%s,%d\n",crn_l,crn_l,v);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4730 if (v<0)
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4731 printf("\taddme %s,%s\n",crn_h,crn_h);
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4732 else
f5efe15629d4 *** empty log message ***
kono
parents: 230
diff changeset
4733 printf("\taddze %s,%s\n",crn_h,crn_h);
213
kono
parents: 212
diff changeset
4734 break;
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4735 case LBOR:
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4736 printf("\tori %s,%s,lo16(%d)\n",crn_l,crn_l,v);
213
kono
parents: 212
diff changeset
4737 break;
kono
parents: 212
diff changeset
4738 default:
kono
parents: 212
diff changeset
4739 error(-1);
kono
parents: 212
diff changeset
4740 }
kono
parents: 212
diff changeset
4741 }
kono
parents: 212
diff changeset
4742
kono
parents: 212
diff changeset
4743
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4744 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4745 emit_lpop_free(int xreg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4746 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4747 if (xreg>=0)
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4748 free_register(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4749 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4750
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4751 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4752 emit_lpush()
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4753 {
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4754 int new_reg;
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
4755 if (!is_longlong_reg(creg)) error(-1);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4756 if (lreg_sp>MAX_MAX) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4757 new_reg = get_lregister(); /* ���Ф˼���(?) */
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4758 lreg_stack[lreg_sp++] = creg; /* push ���뤫���˥쥸������Ȥ� */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4759 lreg = creg = new_reg;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4760 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4761
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4762 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4763 code_i2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4764 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4765 char *crn,*crn_h,*crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4766 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4767 crn = register_name(reg0 = ireg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4768 use_longlong(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4769 crn_h = lregister_name_high(lreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4770 crn_l = lregister_name_low(lreg);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4771 if (reg0!=regv_l(lreg))
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4772 printf("\tmr %s,%s\n",crn_l,crn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4773 printf("\tsrawi %s,%s,31\n",crn_h,crn_l);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4774 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4775
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4776 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4777 code_i2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4778 {
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4779 code_i2ll(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4780 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4781
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4782 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4783 code_u2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4784 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4785 char *crn,*crn_h,*crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4786 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4787 crn = register_name(reg0 = ireg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4788 use_longlong(reg);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4789 crn_h = lregister_name_high(lreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4790 crn_l = lregister_name_low(lreg);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4791 if (reg0!=regv_l(lreg))
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4792 printf("\tmr %s,%s\n",crn_l,crn);
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4793 printf("\tli %s,0\n",crn_h);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4794 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4795
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4796 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4797 code_u2ull(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4798 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4799 code_u2ll(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4800 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4801
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4802 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4803 code_ll2i(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4804 {
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
4805 char *crn_l;
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4806 int reg0;
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4807 crn_l = lregister_name_low(reg0=lreg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4808 use_int(reg);
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4809 if (ireg!=regv_l(reg0))
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4810 printf("\tmr %s,%s\n",register_name(ireg),crn_l);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4811 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4812
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4813 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4814 code_ll2u(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4815 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4816 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4817 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4818
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4819 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4820 code_ull2i(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4821 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4822 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4823 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4824
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4825 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4826 code_ull2u(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4827 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4828 code_ll2i(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4829 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4830
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4831 #if FLOAT_CODE
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4832
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4833 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4834 code_d2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4835 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4836 // fixdfdi$stub
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4837 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4838 extern_conv("__fixdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4839 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4840 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4841 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4842 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4843
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4844 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4845 code_d2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4846 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4847 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4848 extern_conv("__fixunsdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4849 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4850 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4851 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4852 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4853
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4854 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4855 code_f2ll(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4856 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4857 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4858 extern_conv("__fixdfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4859 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4860 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4861 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4862 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4863
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4864 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4865 code_f2ull(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4866 {
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4867 set_freg(RET_FREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4868 extern_conv("__fixsfdi");
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4869 set_lreg(RET_LREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4870 if (reg!=USE_CREG&&reg!=RET_LREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4871 use_longlong(reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4872 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4873
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4874 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4875 code_ll2d(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4876 {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4877 set_lreg(RET_LREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4878 extern_conv("__floatdidf");
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4879 set_freg(RET_FREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4880 if (reg!=USE_CREG&&reg!=RET_FREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4881 use_float(1,reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4882 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4883
217
a4d3818f5353 *** empty log message ***
kono
parents: 216
diff changeset
4884
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4885 void
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4886 code_ll2f(int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4887 {
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
4888 set_lreg(RET_LREGISTER,1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4889 extern_conv("__floatdisf");
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
4890 set_freg(RET_FREGISTER,0);
239
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4891 if (reg!=USE_CREG&&reg!=RET_FREGISTER)
1849e0079f08 ia32 long long continue
kono
parents: 238
diff changeset
4892 use_float(0,reg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4893 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4894
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4895 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4896 code_ull2d(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4897 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4898 code_ll2d(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4899 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4900
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4901 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4902 code_ull2f(int creg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4903 {
215
abfad046e6de *** empty log message ***
kono
parents: 214
diff changeset
4904 code_ll2f(creg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4905 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4906
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4907 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4908
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4909 static void
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4910 ladd(int creg,int reg,int dir) // creg=reg+dir
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4911 {
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4912 printf("\taddic %s,%s,%d\n",
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4913 lregister_name_low(creg),lregister_name_low(reg), dir);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4914 printf("\tadd%s %s,%s\n", dir>0?"ze":"me",
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4915 lregister_name_high(creg),lregister_name_high(reg));
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4916 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4917
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4918 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4919 code_lpreinc(int e1,int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4920 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4921 int dreg,xreg;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4922 int dir=caddr(e1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4923 if (car(e2)==LREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4924 use_longlong(reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4925 ladd(cadr(e2),cadr(e2),dir);
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4926 if (reg!=cadr(e2)) {
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4927 lmove(reg,cadr(e2));
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4928 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4929 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4930 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4931 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4932 if(!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4933 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4934 if (reg==USE_CREG) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4935 dreg=get_lregister(); if (!dreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4936 set_lreg(dreg,0); // free old lreg==creg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4937 } else {
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4938 dreg = reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4939 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4940 xreg = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4941 lload(xreg,dreg,0);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4942 ladd(dreg,dreg,dir);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4943 code_lassign(xreg,dreg);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4944 emit_pop_free(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4945 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4946
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4947 void
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4948 code_lpostinc(int e1,int e2,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4949 {
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4950 int dreg,nreg,xreg;
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4951 int dir=caddr(e1);
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4952 if (car(e2)==LREGISTER) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4953 use_longlong(reg);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4954 if (reg!=cadr(e2))
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4955 lmove(reg,cadr(e2));
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4956 ladd(cadr(e2),cadr(e2),dir);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4957 return;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4958 }
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4959 g_expr(e2);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4960 if(!is_int_reg(creg)) error(-1);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4961 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4962 nreg=get_lregister(); if (!nreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4963 if (reg==USE_CREG) {
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4964 dreg=get_lregister(); if (!dreg) error(-1);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4965 set_lreg(dreg,0); // free old lreg==creg
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4966 } else {
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4967 dreg = reg;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4968 }
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4969 xreg = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4970 lload(xreg,dreg,0);
273
87b9cfc86a10 *** empty log message ***
kono
parents: 271
diff changeset
4971 ladd(nreg,dreg,dir);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4972 code_lassign(xreg,nreg);
222
3d214303bae9 *** empty log message ***
kono
parents: 221
diff changeset
4973 emit_pop_free(xreg);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4974 free_register(nreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4975 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4976
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4977 void
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4978 code_lassop(int op,int reg)
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
4979 {
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4980 int xreg;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4981 int edx,edx0=-1;
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4982
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4983 // (*creg) op = pop()
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4984 xreg = emit_lpop(0); /* pop e3 value */
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4985 if (!is_int_reg(creg)) error(-1);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4986 edx = ireg;
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4987 emit_push();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4988 use_longlong(reg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4989 if (regv_l(lreg)==edx || regv_h(lreg)==edx) {
285
912b54949344 register assop const ( int/long )
kono
parents: 283
diff changeset
4990 // this can't happen
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4991 edx0 = get_register(); if(!edx0) error(-1);
468
464e7480395c *** empty log message ***
kono
parents: 467
diff changeset
4992 printf("## lassop\n\tmr %s,%s\n",register_name(edx0),register_name(edx));
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4993 edx = edx0;
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
4994 }
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4995 lload(edx0=edx,reg,0);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
4996 ltosop(op,reg,xreg);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4997 use_reg(reg);
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
4998 edx = emit_pop(0);
269
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
4999 code_lassign(edx,reg);
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
5000 if (edx0!=-1)
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
5001 free_register(edx0);
d9f4026de4e3 MIPS continue...
kono
parents: 268
diff changeset
5002 emit_pop_free(edx);
211
dbad3172fa14 *** empty log message ***
kono
parents: 210
diff changeset
5003 emit_lpop_free(xreg);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5004 }
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5005
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
5006 void
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
5007 code_register_lassop(int reg,int op) {
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5008 // reg op = pop()
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
5009 int xreg=emit_lpop();
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5010 ltosop(op,reg,xreg);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5011 emit_lpop_free(xreg);
219
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
5012 }
6190d24e178c long long code generation level 4
kono
parents: 218
diff changeset
5013
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5014
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5015 #endif
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5016
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5017 void
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5018 code_save_stacks()
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5019 {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
5020 int i,reg;
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5021 for(i=0;i<reg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
5022 if ((reg=reg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5023 code_assign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
5024 (reg_stack[i]=new_lvar(SIZE_OF_INT)),reg,0);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5025 reg_stack[i]= reg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5026 free_register(reg);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5027 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5028 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5029 #if FLOAT_CODE
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5030 for(i=0;i<freg_sp;i++) {
103
f849af4b5ea9 *** empty log message ***
kono
parents: 102
diff changeset
5031 if ((reg=freg_stack[i])>=0) {
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5032 code_dassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
5033 (freg_stack[i]=new_lvar(SIZE_OF_DOUBLE)),reg,1);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5034 freg_stack[i]= freg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5035 free_register(reg);
101
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5036 }
05f197a4573a *** empty log message ***
kono
parents: 100
diff changeset
5037 }
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5038 #endif
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5039 #if LONGLONG_CODE
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5040 for(i=0;i<lreg_sp;i++) {
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5041 if ((reg=lreg_stack[i])>=0) {
223
1ac647873577 *** empty log message ***
kono
parents: 222
diff changeset
5042 code_lassign_lvar(
245
8a72b0afccfc *** empty log message ***
kono
parents: 240
diff changeset
5043 (lreg_stack[i]=new_lvar(SIZE_OF_LONGLONG)),reg);
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5044 lreg_stack[i]= lreg_stack[i]-REG_LVAR_OFFSET;
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5045 free_register(reg);
212
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5046 }
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5047 }
32f54ab63b35 *** empty log message ***
kono
parents: 211
diff changeset
5048 #endif
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5049 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5050
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5051 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5052 emit_lib(char *p[])
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5053 {
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
5054 while(*p) {
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
5055 printf("%s\n",*p++);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5056 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5057 }
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5058
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5059 void
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5060 code_closing()
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5061 {
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5062 #if FLOAT_CODE
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5063 if (d2u_lib_used) emit_lib(d2u_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5064 if (u2d_lib_used) emit_lib(u2d_lib);
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5065 if (float_one_lib_used) emit_lib(float_one_lib);
98
07c2554e1cfa *** empty log message ***
kono
parents: 97
diff changeset
5066 if (float_zero_lib_used) emit_lib(float_zero_lib);
96
7d8de41390d8 *** empty log message ***
kono
parents: 95
diff changeset
5067 if (i2d_lib_used) emit_lib(i2d_lib);
195
c193120ee2a6 *** empty log message ***
kono
parents: 189
diff changeset
5068 #endif
213
kono
parents: 212
diff changeset
5069 #if LONGLONG_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
5070 if (asld_lib_used) emit_lib(asld_lib);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5071 if (lsrd_lib_used) emit_lib(lsrd_lib);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5072 if (asrd_lib_used) emit_lib(asrd_lib);
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5073 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5074 if (lumod_lib_used) emit_lib(lumod_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5075 if (lmod_lib_used) emit_lib(lmod_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5076 if (ludiv_lib_used) emit_lib(ludiv_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5077 if (ldiv_lib_used) emit_lib(ldiv_lib);
221
ceae585186d9 *** empty log message ***
kono
parents: 220
diff changeset
5078 #endif
213
kono
parents: 212
diff changeset
5079 #if FLOAT_CODE
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
5080 #if 0
216
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5081 if (dl2ll_lib_used) emit_lib(dl2ll_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5082 if (d2ull_lib_used) emit_lib(d2ull_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5083 if (f2ll_lib_used) emit_lib(f2ll_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5084 if (f2ull_lib_used) emit_lib(f2ull_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5085 if (ll2d_lib_used) emit_lib(ll2d_lib);
941177f65d07 *** empty log message ***
kono
parents: 215
diff changeset
5086 if (ll2f_lib_used) emit_lib(ll2f_lib);
213
kono
parents: 212
diff changeset
5087 #endif
kono
parents: 212
diff changeset
5088 #endif
218
2d64e82437d2 *** empty log message ***
kono
parents: 217
diff changeset
5089 #endif
97
6d42fcac07af *** empty log message ***
kono
parents: 96
diff changeset
5090 global_table();
108
69e2e763cce5 object assemble first try.
kono
parents: 107
diff changeset
5091 /* printf("\t.ident \"Micro-C compiled\"\n"); */
95
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5092 }
185d2cc6a3a9 *** empty log message ***
kono
parents: 93
diff changeset
5093
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5094 #if CASE_CODE
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5095
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5096 int
382
832e1f6bba82 ARM wrote all code. Check compile error.
kono
parents: 375
diff changeset
5097 code_table_jump_p(int delta) { return 1; }
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5098
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5099 void
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5100 code_table_jump(int l,int csvalue,int delta,int max,int min,int dlabel)
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5101 {
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5102 int t,s,u=-1;
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5103 char *crn = register_name(csvalue); // can be t,s,u
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5104 char *trn = register_name(t=get_register());
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5105 char *srn = register_name(s=get_register());
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5106 char *urn;
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5107
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5108 inc_cmpflag();
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5109 if (min>32767||min<-32765) {
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5110 if (t==csvalue) {
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5111 code_const(min,s);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5112 printf("\tsub\t%s,%s,%s\n",trn,crn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5113 } else {
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5114 code_const(min,t);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5115 printf("\tsub\t%s,%s,%s\n",trn,crn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5116 }
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5117 } else {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5118 printf("\taddi\t%s,%s,lo16(%d)\n",trn,crn,-min);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5119 }
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5120 printf("\tcmplwi cr%d,%s,%d\n",cmpflag,trn,max-min);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5121 printf("\tbgt-\tcr%d,L_%d\n",cmpflag,dlabel);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5122 inc_cmpflag();
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5123 switch(delta) {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5124 case 1: printf("\tslwi %s,%s,2\n",trn,trn); break;
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5125 case 2:
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5126 printf("\tli %s,1\n",srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5127 printf("\tand %s,%s,%s\n",srn,srn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5128 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5129 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5130 printf("\tslwi %s,%s,1\n",trn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5131 break;
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5132 case 4:
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5133 printf("\tli %s,3\n",srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5134 printf("\tand %s,%s,%s\n",srn,srn,trn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5135 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5136 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5137 break;
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5138 default:
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5139 urn = register_name(u=get_register());
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5140 printf("\tli %s,%d\n",srn,delta);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5141 printf("\tdivwu %s,%s,%s\n",urn,trn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5142 printf("\tmullw %s,%s,%s\n",srn,urn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5143 printf("\tsubf %s,%s,%s\n",srn,trn,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5144 printf("\tcmplwi cr%d,%s,0\n",cmpflag,srn);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5145 printf("\tbne\tcr%d,L_%d\n",cmpflag,dlabel);
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5146 printf("\tslwi %s,%s,2\n",trn,urn);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5147 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5148 printf("\taddis %s,r31,ha16(L_%d-L_%d)\n",
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5149 srn,l,code_base);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5150 printf("\tla %s,lo16(L_%d-L_%d)(%s)\n",
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5151 srn,l,code_base,srn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5152 printf("\tadd %s,%s,%s\n",trn,srn,trn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5153 printf("\tlwz r0,0(%s)\n",trn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5154 printf("\tadd r0,r0,%s\n",srn);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5155 printf("\tmtctr r0\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5156 printf("\tbctr\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5157
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5158 free_register(s);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5159 free_register(t);
302
bea7ab2fb218 switch table jump finished.
kono
parents: 300
diff changeset
5160 if (u!=-1) free_register(u);
300
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5161 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5162
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5163 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5164 code_table_open(int l)
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5165 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5166 printf("\t.p2align 2\n");
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5167 fwddef(l);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5168 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5169
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5170 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5171 code_table_value(int label,int table_top)
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5172 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5173 printf("\t.long L_%d-L_%d\n",label,table_top);
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5174 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5175
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5176 void
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5177 code_table_close()
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5178 {
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5179 }
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5180
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5181 #endif
86255dd7f148 table done. (?)
kono
parents: 297
diff changeset
5182
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5183 #if ASM_CODE
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5184
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5185 /*
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5186 print an operand
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5187 */
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5188
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5189 static void
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5190 emit_asm_operand(int rstr)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5191 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5192 if (car(rstr)==REGISTER) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5193 printf("%s",register_name(cadr(rstr)));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5194 } else if (car(rstr)==CONST) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5195 printf("%d",cadr(rstr));
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5196 } else if (car(rstr)==FNAME) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5197 printf("%s",(char*)cadr(rstr));
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5198 } else if (car(rstr)==STRING) {
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5199 printf("L_%d",cadr(rstr));
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5200 } else {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5201 error(-1);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5202 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5203 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5204
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5205 /*
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5206 prepare asm operands
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5207
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5208 char *constraints sgtring
326
e5d40f8c4cce bit-field continue.
kono
parents: 324
diff changeset
5209 int oeprand expr
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5210 int mode (ASM_INPUT,ASM_OUTPUT)
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5211 int replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5212 int output operands count
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5213 int output operands replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5214
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5215 retrun replacement list
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5216 list3( operands, next, clobber )
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5217 0 can be shared in input/output
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5218 1 can't be used in input
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5219 */
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5220
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5221 extern int
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5222 code_asm_operand(char *p,int e1,int mode,int repl,int n,int repl0)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5223 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5224 int r;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5225 int c;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5226 int val;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5227 int clobber = 0;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5228
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5229 printf("## constraint %s\n",p);
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5230 retry:
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5231 switch((c=*p)) {
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5232 case '?':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5233 case '!':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5234 case '+':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5235 case '%':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5236 case '#':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5237 case '*':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5238 case '=':
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5239 // output register
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5240 p++;
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5241 goto retry;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5242 case '&':
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5243 // earlyclobber
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5244 p++;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5245 clobber = 1;
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5246 goto retry;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5247 case 'b': // address base register (what?)
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5248 case 'r':
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5249 if (mode==ASM_INPUT) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5250 for(;repl0;repl0 = cadr(repl0)) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5251 if (car(car(repl0))==REGISTER && caddr(repl0)==0) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5252 r = cadr(car(repl0));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5253 caddr(repl0) = ASM_USED;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5254 break;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5255 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5256 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5257 r = get_register();
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5258 } else {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5259 r = get_register();
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5260 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5261 repl = list3(list2(REGISTER,r),repl,clobber);
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5262 break;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5263 case 'm':
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5264 repl = list3(list2(0,0),repl,clobber);
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5265 break;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5266 case 'i':
368
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5267 if (car(e1)==GVAR) {
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5268 e1=list3(FNAME,(int)(((NMTBL *)caddr(e1))->nm),0);
be56772ab12a global offset, parallel_rassign fix, save_stack fix.
kono
parents: 367
diff changeset
5269 } else if (car(e1)==FNAME) {
319
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5270 e1=list3(FNAME,(int)(((NMTBL *)cadr(e1))->nm),0);
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5271 } else if (car(e1)==STRING) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5272 val = emit_string_label();
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5273 ascii((char*)cadr(e1));
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5274 e1=list3(STRING,val,0);
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5275 } else if (car(e1)==CONST) {
88cf6512fa1b asm for powerpc done.
kono
parents: 318
diff changeset
5276 } else error(-1);
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5277 repl = list3(e1,repl,clobber);
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5278 break;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5279 case '0': case '1': case '2': case '3': case '4':
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5280 case '5': case '6': case '7': case '8': case '9':
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5281 val = 0;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5282 do { val = val*10 + c-'0'; } while (digit(c=*p++));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5283 if (val>MAX_ASM_REG) error(-1); // too large register
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5284 if (n-val<0) error(-1);
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5285 repl = list3(car(nth(n-val-1,repl0)),repl,clobber);
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5286 break;
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5287 default:
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5288 printf("### unknown asm constraint %c\n",c);
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5289 }
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5290 return repl;
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5291 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5292
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5293 void
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5294 code_free_asm_operand(int repl)
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5295 {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5296 for(;repl;repl=cadr(repl)) {
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5297 if (car(car(repl))==REGISTER)
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5298 free_register(cadr(car(repl)));
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5299 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5300 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5301
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5302
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5303 extern void
327
da2e3f2d127d macro/codegen reorganization
kono
parents: 326
diff changeset
5304 code_asm(char *asm_str,int repl)
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5305 {
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5306 int c,i,rstr,val;
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5307 char *p;
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5308 int reg[MAX_ASM_REG];
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5309
516
bfa4c834a3b8 data/text/rodata segment fix (incomplete)
kono
parents: 513
diff changeset
5310 text_mode(0);
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5311 c = *asm_str;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5312 if (c!='\t'&&c!=' ') printf("\t");
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5313 for(i=0;repl && i<MAX_ASM_REG;i++) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5314 reg[i] = car(repl);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5315 repl = cadr(repl);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5316 }
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5317 p = asm_str;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5318 while((c = *p++)) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5319 if (c=='%') {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5320 c = *p++;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5321 if (!c) { break;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5322 } else if (c=='%') {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5323 printf("%%"); continue;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5324 } else if (!digit(c)) {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5325 printf("%%%c",c); continue;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5326 }
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5327 val = 0;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5328 do { val = val*10 + c-'0'; } while (digit(c=*p++)) ;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5329 p--;
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5330 if (val>MAX_ASM_REG) error(-1); // too large register
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5331 rstr = reg[val];
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5332 emit_asm_operand(rstr);
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5333 } else {
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5334 printf("%c",c);
318
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5335 }
9fe0b32a7d57 asm continue...
kono
parents: 316
diff changeset
5336 }
320
183726ccd83d asm minor fix. ia32 table jmp fix.
kono
parents: 319
diff changeset
5337 printf("\n");
316
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5338 }
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5339
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5340 #endif
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5341
22d92986c7f7 asm, valued statement, local decls continue...
kono
parents: 313
diff changeset
5342
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5343 #if BIT_FIELD_CODE
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5344
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5345 /* bit field alignment calcuration */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5346
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5347 static void
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5348 set_bitsz(int type,int *pbitpos,int *pbitsize,
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5349 int *psign,int *pbitsz,int *palign,int *pl)
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5350 {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5351 int sign=0,bitsz;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5352 int align,l=0;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5353 *pbitpos = cadr(caddr(type));
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5354 *pbitsize = caddr(caddr(type));
420
efbd420386c5 non aligned bitfield (not yet finished)
kono
parents: 418
diff changeset
5355 switch(cadr(type)) { /* value type */
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5356 case INT: sign=1; bitsz=32; align=4;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5357 case UNSIGNED: bitsz=32; align=4;break;
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5358 case CHAR: sign=1; bitsz= 8; align=1;break;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5359 case UCHAR: bitsz= 8; align=1;break;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5360 case SHORT: sign=1; bitsz=16; align=2;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5361 case USHORT: sign=1; bitsz=16; align=2;break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5362 case LONGLONG: sign=1; bitsz=64; align=4;l=1; break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5363 case ULONGLONG: bitsz=64; align=4;l=1; break;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5364 default: error(-1);
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5365 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5366 *psign = sign;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5367 *pbitsz = bitsz;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5368 *palign = align;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5369 *pl = l;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5370 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5371
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5372 /*
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5373 bit field alignment calcuration
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5374 this is architecture depenedent
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5375 */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5376
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5377 extern int
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5378 code_bit_field_disp(int type,int *poffset,int *bfd,int *sz)
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5379 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5380 int sign,bitsz,align;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5381 int i;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5382 int bitpos = *bfd;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5383 int bitpos0;
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5384 int bitsize;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5385 int offset = *poffset;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5386 int l;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5387 set_bitsz(type,&bitpos0,&bitsize,&sign,&bitsz,&align,&l);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5388
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5389 if (bitsize>bitsz) { error(BTERR); bitsize = i; }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5390
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5391 /* bfd means previous bit field bit offset */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5392 if (bitpos) {
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5393 /* previous field is bit field and spaces may remain */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5394 /* calc previsous offset */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5395
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5396 i= offset-(bitpos+7)/8;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5397
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5398 for(l = bitpos;l>0;l -= 8,i++) {
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5399 if ((i & (align-1))==0 && l+bitsize <= bitsz) {
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5400 /* alignment is correct and space remains */
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5401 *poffset=offset=i;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5402 i = l+bitsize;
423
8b9136a06f56 bitfield continue...
kono
parents: 420
diff changeset
5403 *bfd = (i==bitsz)?0:i;
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5404 *sz = (i+7)/8;
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5405 // 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
5406 return l;
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5407 }
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5408 }
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5409 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5410
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5411 /* first bit-field */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5412
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5413 if ((i=(offset & (align-1)))) {
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5414 *poffset = (offset += (align-i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5415 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5416 bitpos = 0;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5417 *bfd = (bitsize==bitsz)?0:bitsize;
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5418 *sz = (bitsize+7)/8;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5419
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5420 // printf("## bitpos=%d bitsize=%d bitsz=%d offset=%d\n",bitpos,bitsize,bitsz,*poffset);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5421 return bitpos;
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5422 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5423
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5424 /* bit field value */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5425
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5426 extern void
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5427 code_bit_field(int type,int adr, int reg)
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5428 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5429 int sign,bitsz,l,align;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5430 int bitsize,bitpos;
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5431 int i,size;
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5432 set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5433 size = bitsz/8;
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5434 // printf("## %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5435 /* this implementation returns -1 for int i:1; */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5436 if (l==1) {
440
a531bbf572e3 regression test (case, float, long long)
kono
parents: 438
diff changeset
5437 #if LONGLONG_CODE
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5438 // use_int(adr);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5439 use_longlong(reg);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5440 lload(adr,reg,0);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5441 /* shift left */
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5442 if (bitpos)
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5443 loprtc(LLSHIFT,reg,list2(CONST,bitpos));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5444 /* shift right */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5445 if ((i=bitsz-bitsize))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5446 loprtc(sign?LRSHIFT:LURSHIFT,reg,list2(CONST,i));
440
a531bbf572e3 regression test (case, float, long long)
kono
parents: 438
diff changeset
5447 #endif
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5448 } else {
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5449 // use_int(adr);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5450 use_int(reg);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5451 printf("\t%s %s,lo16(%d)(%s)\n",cload(size),
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5452 register_name(reg),0,register_name(adr));
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5453 cext(sign,size,reg);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5454 /* shift left */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5455 if ((i=bitpos+(32-bitsz)))
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5456 oprtc(LSHIFT,reg,list2(CONST,i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5457 /* shift right */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5458 if ((i=bitsz-bitsize+(32-bitsz)))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5459 oprtc(sign?RSHIFT:URSHIFT,reg,list2(CONST,i));
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5460 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5461 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5462
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5463 /* bit field replacement */
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5464
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5465 static void
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5466 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
5467 {
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5468 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5469 code_const(~mask,tmp);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5470 printf("\tor %s,%s,%s\n",trn,crn,trn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5471 /* do conjunction */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5472 printf("\tand %s,%s,%s\n",lrn,trn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5473 /* make or-mask */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5474 code_const(mask,tmp);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5475 printf("\tand %s,%s,%s\n",trn,crn,trn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5476 /* do disjunction */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5477 printf("\tor %s,%s,%s\n",crn,trn,lrn);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5478 }
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5479
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5480 extern void
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5481 code_bit_replace(int adr,int value,int type)
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5482 {
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5483 int sign,bitsz,l,align;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5484 int bitsize,bitpos;
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5485 int mask = 0;
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5486 int tmp = -1;
331
f25aa4f03198 bit-field continue...
kono
parents: 330
diff changeset
5487 int i;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5488 int lvalue;
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5489 char *crn,*lrn,*trn;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5490 int size;
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5491 set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5492 size = bitsz/8;
467
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
5493 // printf("## %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5494 if (l) {
440
a531bbf572e3 regression test (case, float, long long)
kono
parents: 438
diff changeset
5495 #if LONGLONG_CODE
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5496 // use_int(adr);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5497 lvalue = get_lregister();
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5498 lload(adr,lvalue,0);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5499 use_longlong(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5500 crn = lregister_name_low(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5501 lrn = lregister_name_low(lvalue);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5502 /* shift left */
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5503 if ((i=bitsz-bitsize-bitpos))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5504 loprtc(LLSHIFT,value,list2(CONST,i));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5505 trn = register_name(tmp = get_register());
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5506 if (bitpos+bitsize>=32) {
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5507 /* make and-mask lower */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5508 mask = make_mask(bitpos>=32?bitpos-32:0,bitpos+bitsize-32-1);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5509 make_mask_and_or(mask,tmp,trn,crn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5510 }
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5511 crn = lregister_name_high(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5512 lrn = lregister_name_high(lvalue);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5513 if (bitpos<32) {
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5514 /* make and-mask upper */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5515 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5516 make_mask_and_or(mask,tmp,trn,crn,lrn);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5517 }
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5518 code_lassign(adr,value);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5519 free_register(lvalue);
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5520 // free_register(adr);
440
a531bbf572e3 regression test (case, float, long long)
kono
parents: 438
diff changeset
5521 #endif
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5522 } else {
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5523 // use_int(adr);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5524 use_int(value);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5525 lvalue = get_register();
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5526 printf("\t%s %s,lo16(%d)(%s)\n",cload(size),
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5527 register_name(lvalue),0,register_name(adr));
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5528 cext(sign,size,lvalue);
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5529 crn = register_name(value);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5530 lrn = register_name(lvalue);
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5531 /* shift left */
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5532 if ((i=bitsz-bitsize-bitpos))
335
4f98dc4b5fd8 bit-field continue... code-generation debug
kono
parents: 334
diff changeset
5533 oprtc(LSHIFT,value,list2(CONST,i));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5534 trn = register_name(tmp = get_register());
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5535 /* make and-mask */
336
d488b72254fb bit-field done.
kono
parents: 335
diff changeset
5536 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz));
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5537 make_mask_and_or(mask,tmp,trn,crn,lrn);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5538 free_register(lvalue);
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5539 code_assign(adr,size,value);
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5540 }
330
fa4c7b15d7ed bit field all code written
kono
parents: 329
diff changeset
5541 if (tmp!=-1) free_register(tmp);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5542 if (use) {
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5543 code_bit_field(type,adr,USE_CREG);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5544 }
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5545 }
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5546
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5547 static void
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5548 make_mask_and_or_const(int mask,char *crn,int c)
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5549 {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5550 char *trn;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5551 int tmp = -1;
527
6b0fd56848e6 inline continue....
kono
parents: 526
diff changeset
5552 // printf("## mask 0x%08x ~0x%08x\n",mask,~mask);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5553 if ((~mask|c)!=-1) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5554 trn = register_name(tmp=get_register());
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5555 code_const((~mask|c),tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5556 /* do conjunction */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5557 printf("\tand %s,%s,%s\n",crn,trn,crn);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5558 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5559 /* make or-mask */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5560 c = mask&c;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5561 if (c!=0) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5562 /* do disjunction */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5563 if (!((mask&c)&0xffff0000)) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5564 printf("\tori %s,%s,lo16(%d)\n",crn,crn,c);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5565 } else {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5566 trn = register_name(tmp=get_register());
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5567 code_const(c,tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5568 printf("\tor %s,%s,%s\n",crn,trn,crn);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5569 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5570 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5571 if (tmp!=-1) free_register(tmp);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5572 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5573
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5574 extern void
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5575 code_bit_replace_const(int value,int adr,int type)
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5576 {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5577 int sign,bitsz,l,align;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5578 int bitsize,bitpos,size;
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5579 int mask = 0;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5580 int i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5581 int c;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5582 int lvalue;
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5583 #if LONGLONG_CODE
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5584 long long lc;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5585 #endif
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5586 char *crn;
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5587 set_bitsz(type,&bitpos,&bitsize,&sign,&bitsz,&align,&l);
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5588 size = bitsz/8;
467
32737bad7489 fix list/tag interference
kono
parents: 463
diff changeset
5589 // printf("## %d: bitpos=%d bitsize=%d bitsz=%d\n",lineno,bitpos,bitsize,bitsz);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5590 if (l) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5591 #if LONGLONG_CODE
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5592 use_int(adr);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5593 lvalue = get_lregister();
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5594 lload(adr,lvalue,0);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5595 crn = lregister_name_low(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5596 /* shift left */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5597 lc = lcadr(value);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5598 if ((i=bitsz-bitsize-bitpos))
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5599 lc <<= i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5600 if (bitpos+bitsize>=32) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5601 /* make and-mask lower */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5602 mask = make_mask(bitpos>=32?bitpos-32:0,bitpos+bitsize-32-1);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5603 make_mask_and_or_const(mask,crn,(int)lc);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5604 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5605 crn = lregister_name_high(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5606 if (bitpos<32) {
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5607 /* make and-mask upper */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5608 mask = make_mask(bitpos,bitpos+bitsize>=32?31:bitpos+bitsize-1);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5609 make_mask_and_or_const(mask,crn,(int)(lc>>32));
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5610 }
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5611 code_lassign(adr,lvalue);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5612 free_register(lvalue);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5613 #endif
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5614 } else {
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5615 use_int(adr);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5616 lvalue = get_register();
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5617 printf("\t%s %s,lo16(%d)(%s)\n",cload(size),
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5618 register_name(lvalue),0,register_name(adr));
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5619 cext(sign,size,lvalue);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5620 crn = register_name(lvalue);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5621 /* shift left */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5622 c = cadr(value);
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5623 if ((i=bitsz-bitsize-bitpos))
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5624 c <<= i;
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5625 /* make and-mask */
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5626 mask = make_mask(bitpos+(32-bitsz),bitpos+bitsize-1+(32-bitsz));
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5627 make_mask_and_or_const(mask,crn,c);
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5628 code_assign(adr,size,lvalue);
426
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5629 free_register(lvalue);
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5630 }
fb136af3bf09 Bitfield reorganization.
kono
parents: 423
diff changeset
5631 if (use) {
431
800a5e3e6a17 *** empty log message ***
kono
parents: 426
diff changeset
5632 code_bit_field(type,adr,USE_CREG);
365
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5633 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5634 }
5ac17fa9d7e0 bit-field constant assignment
kono
parents: 363
diff changeset
5635
329
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5636 #endif
4c8f8ef8c0cf bit field continue...
kono
parents: 328
diff changeset
5637
89
917947ffeb7c power pc version
kono
parents:
diff changeset
5638 /* end */