04d0f4863362a05ad971a9a75c28947d4d02ba68
[mono.git] / mono / mini / inssel-ppc.brg
1 %%
2
3 #
4 # inssel-ppc.brg: burg file for special ppc instructions
5 #
6 # Author:
7 #   Dietmar Maurer (dietmar@ximian.com)
8 #   Paolo Molaro (lupus@ximian.com)
9 #
10 # (C) 2002 Ximian, Inc.
11 #
12
13 stmt: OP_START_HANDLER {
14         MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
15         MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, spvar->inst_basereg, spvar->inst_offset, ppc_sp);
16 }
17
18 stmt: CEE_STIND_I8 (OP_REGVAR, lreg) {
19         /* this should only happen for methods returning a long */
20         MONO_EMIT_NEW_UNALU (s, OP_MOVE, ppc_r3, state->right->reg1);
21         MONO_EMIT_NEW_UNALU (s, OP_MOVE, ppc_r4, state->right->reg2);
22 }
23
24 lreg: OP_LNEG (lreg) "2" {
25         MONO_EMIT_NEW_BIALU_IMM (s, OP_PPC_SUBFIC, state->reg1, state->left->reg1, 0);
26         MONO_EMIT_UNALU (s, tree, OP_PPC_SUBFZE, state->reg2, state->left->reg2);
27 }
28
29 freg: OP_LCONV_TO_R8 (lreg) {
30         mono_bblock_add_inst (s->cbb, tree);
31 }
32
33 freg: OP_LCONV_TO_R4 (lreg) {
34         mono_bblock_add_inst (s->cbb, tree);
35 }
36
37 freg: CEE_CONV_R_UN (reg) {
38         mono_bblock_add_inst (s->cbb, tree);
39 }
40
41 reg: OP_LOCALLOC (OP_ICONST) {
42         /* microcoded in mini-ppc.c */
43         tree->sreg1 = mono_regstate_next_int (s->rs);
44         MONO_EMIT_NEW_ICONST (s, tree->sreg1, state->left->tree->inst_c0);
45         mono_bblock_add_inst (s->cbb, tree);
46 }
47
48 reg: OP_LOCALLOC (reg) {
49         mono_bblock_add_inst (s->cbb, tree);
50 }
51
52 stmt: OP_SETRET (reg) {
53         tree->opcode = OP_MOVE;
54         tree->sreg1 = state->left->reg1;
55         tree->dreg = ppc_r3;
56         mono_bblock_add_inst (s->cbb, tree);
57 }
58
59 stmt: OP_SETRET (lreg) {
60         MONO_EMIT_NEW_UNALU (s, OP_MOVE, ppc_r3, state->left->reg2);
61         tree->opcode = OP_MOVE;
62         tree->sreg1 = state->left->reg1;
63         tree->dreg = ppc_r4;
64         mono_bblock_add_inst (s->cbb, tree);
65 }
66
67 stmt: OP_SETRET (freg) {
68         tree->opcode = OP_FMOVE;
69         tree->sreg1 = state->left->reg1;
70         tree->dreg = ppc_f1;
71         mono_bblock_add_inst (s->cbb, tree);
72 }
73
74 stmt: OP_SETRET (OP_ICONST) {
75         tree->opcode = OP_ICONST;
76         tree->inst_c0 = state->left->tree->inst_c0;
77         tree->dreg = ppc_r3;
78         mono_bblock_add_inst (s->cbb, tree);
79 }
80
81 stmt: OP_OUTARG (reg) {
82         tree->opcode = OP_SETREG;
83         tree->dreg = tree->unused;
84         tree->sreg1 = state->left->reg1;
85         mono_bblock_add_inst (s->cbb, tree);
86 }
87
88 stmt: OP_OUTARG (OP_REGVAR) {
89         tree->opcode = OP_SETREG;
90         tree->dreg = tree->unused;
91         tree->sreg1 = state->left->tree->dreg;
92         mono_bblock_add_inst (s->cbb, tree);
93 }
94
95 stmt: OP_OUTARG (lreg) {
96         MONO_EMIT_NEW_UNALU (s, OP_SETREG, tree->unused, state->left->reg2);
97         tree->opcode = OP_SETREG;
98         tree->dreg = tree->unused + 1;
99         tree->sreg1 = state->left->reg1;
100         mono_bblock_add_inst (s->cbb, tree);
101 }
102
103 stmt: OP_OUTARG (OP_ICONST) {
104         tree->opcode = OP_SETREGIMM;
105         tree->dreg = tree->unused;
106         tree->inst_c0 = state->left->tree->inst_c0;
107         mono_bblock_add_inst (s->cbb, tree);
108 }
109
110 #stmt: OP_OUTARG (CEE_LDIND_I4 (base)) {
111 #       tree->opcode = OP_X86_PUSH_MEMBASE;
112 #       tree->inst_basereg = state->left->left->tree->inst_basereg;
113 #       tree->inst_offset = state->left->left->tree->inst_offset;
114 #       mono_bblock_add_inst (s->cbb, tree);
115 #}
116
117 #stmt: OP_OUTARG (CEE_LDIND_U4 (base)) {
118 #       tree->opcode = OP_X86_PUSH_MEMBASE;
119 #       tree->inst_basereg = state->left->left->tree->inst_basereg;
120 #       tree->inst_offset = state->left->left->tree->inst_offset;
121 #       mono_bblock_add_inst (s->cbb, tree);
122 #}
123
124 #stmt: OP_OUTARG (CEE_LDIND_I (base)) {
125 #       tree->opcode = OP_X86_PUSH_MEMBASE;
126 #       tree->inst_basereg = state->left->left->tree->inst_basereg;
127 #       tree->inst_offset = state->left->left->tree->inst_offset;
128 #       mono_bblock_add_inst (s->cbb, tree);
129 #}
130
131 #stmt: OP_OUTARG (CEE_LDIND_REF (base)) {
132 #       tree->opcode = OP_X86_PUSH_MEMBASE;
133 #       tree->inst_basereg = state->left->left->tree->inst_basereg;
134 #       tree->inst_offset = state->left->left->tree->inst_offset;
135 #       mono_bblock_add_inst (s->cbb, tree);
136 #}
137
138 stmt: OP_OUTARG (CEE_LDIND_REF (OP_REGVAR)) {
139         tree->opcode = OP_SETREG;
140         tree->sreg1 = state->left->left->tree->dreg;
141         tree->dreg = tree->unused;
142         mono_bblock_add_inst (s->cbb, tree);
143 }
144
145 #stmt: OP_OUTARG (CEE_LDOBJ (reg)) {
146 #       tree->opcode = OP_X86_PUSH;
147 #       tree->sreg1 = state->left->reg1;
148 #       mono_bblock_add_inst (s->cbb, tree);
149 #}
150
151 stmt: OP_OUTARG (freg) {
152         tree->opcode = OP_SETFREG;
153         tree->sreg1 = state->left->reg1;
154         tree->dreg = tree->unused;
155         mono_bblock_add_inst (s->cbb, tree);
156 }
157
158 stmt: OP_OUTARG_R4 (freg) {
159         tree->opcode = OP_SETFREG;
160         tree->sreg1 = state->left->reg1;
161         tree->dreg = tree->unused;
162         mono_bblock_add_inst (s->cbb, tree);
163 }
164
165 stmt: OP_OUTARG_R8 (freg) {
166         tree->opcode = OP_SETFREG;
167         tree->sreg1 = state->left->reg1;
168         tree->dreg = tree->unused;
169         mono_bblock_add_inst (s->cbb, tree);
170 }
171
172 stmt: OP_OUTARG_VT (CEE_LDOBJ (base)) {
173         MonoInst *vt = state->left->left->tree;
174         //g_print ("vt size: %d at R%d + %d\n", tree->inst_imm, vt->inst_basereg, vt->inst_offset);
175         if (tree->inst_imm <= 4) {
176                 tree->opcode = OP_X86_PUSH_MEMBASE;
177                 tree->inst_basereg = vt->inst_basereg;
178                 tree->inst_offset = vt->inst_offset;
179                 mono_bblock_add_inst (s->cbb, tree);
180         } else {
181                 tree->opcode = OP_X86_PUSH_OBJ;
182                 tree->inst_basereg = vt->inst_basereg;
183                 tree->inst_offset = vt->inst_offset;
184                 mono_bblock_add_inst (s->cbb, tree);
185         }
186 }
187
188 stmt: OP_OUTARG_VT (OP_ICONST) {
189         tree->opcode = OP_SETREGIMM;
190         tree->dreg = tree->unused;
191         tree->inst_imm = state->left->tree->inst_c0;
192         mono_bblock_add_inst (s->cbb, tree);
193 }
194
195 stmt: CEE_STIND_R8 (OP_REGVAR, freg) {
196         /* nothing to do: the value is already on the FP stack */
197 }
198
199 stmt: CEE_BNE_UN (fpcflags) {
200         tree->opcode = OP_FBNE_UN;
201         mono_bblock_add_inst (s->cbb, tree);
202 }
203
204 stmt: CEE_BEQ (fpcflags) {
205         tree->opcode = OP_FBEQ;
206         mono_bblock_add_inst (s->cbb, tree);
207 }
208
209 stmt: CEE_BLT (fpcflags) {
210         tree->opcode = OP_FBLT;
211         mono_bblock_add_inst (s->cbb, tree);
212 }
213
214 stmt: CEE_BLT_UN (fpcflags) {
215         tree->opcode = OP_FBLT_UN;
216         mono_bblock_add_inst (s->cbb, tree);
217 }
218
219 stmt: CEE_BGT (fpcflags) {
220         tree->opcode = OP_FBGT;
221         mono_bblock_add_inst (s->cbb, tree);
222 }
223
224 stmt: CEE_BGT_UN (fpcflags) {
225         tree->opcode = OP_FBGT_UN;
226         mono_bblock_add_inst (s->cbb, tree);
227 }
228
229 stmt: CEE_BGE  (fpcflags) {
230         tree->opcode = OP_FBGE;
231         mono_bblock_add_inst (s->cbb, tree);
232 }
233
234 stmt: CEE_BGE_UN (fpcflags) {
235         tree->opcode = OP_FBGE_UN;
236         mono_bblock_add_inst (s->cbb, tree);
237 }
238
239 stmt: CEE_BLE  (fpcflags) {
240         tree->opcode = OP_FBLE;
241         mono_bblock_add_inst (s->cbb, tree);
242 }
243
244 stmt: CEE_BLE_UN (fpcflags) {
245         tree->opcode = OP_FBLE_UN;
246         mono_bblock_add_inst (s->cbb, tree);
247 }
248
249 stmt: CEE_POP (freg) "0" {
250         /* nothing to do */
251 }     
252
253 freg: OP_LCONV_TO_R8 (lreg) {
254         /* nothing to do - emulated */
255 }
256
257 freg: OP_LCONV_TO_R_UN (lreg) {
258         /* nothing to do - emulated */
259 }
260
261 freg: OP_FREM (freg, freg) {
262         /* nothing to do - emulated */
263 }
264
265 reg: OP_CEQ (OP_COMPARE (freg, freg)) { 
266         MONO_EMIT_BIALU (s, tree, OP_FCEQ, state->reg1, state->left->left->reg1,
267                          state->left->right->reg1);
268 }
269
270 reg: OP_CLT (OP_COMPARE (freg, freg)) { 
271         MONO_EMIT_BIALU (s, tree, OP_FCLT, state->reg1, state->left->left->reg1,
272                          state->left->right->reg1);
273 }
274
275 reg: OP_CLT_UN (OP_COMPARE (freg, freg)) {      
276         MONO_EMIT_BIALU (s, tree, OP_FCLT_UN, state->reg1, state->left->left->reg1,
277                          state->left->right->reg1);
278 }
279
280 reg: OP_CGT (OP_COMPARE (freg, freg)) { 
281         MONO_EMIT_BIALU (s, tree, OP_FCGT, state->reg1, state->left->left->reg1,
282                          state->left->right->reg1);
283 }
284
285 reg: OP_CGT_UN (OP_COMPARE (freg, freg)) {      
286         MONO_EMIT_BIALU (s, tree, OP_FCGT_UN, state->reg1, state->left->left->reg1,
287                          state->left->right->reg1);
288 }
289
290 %%