4 # inssel-ppc.brg: burg file for special ppc instructions
7 # Dietmar Maurer (dietmar@ximian.com)
8 # Paolo Molaro (lupus@ximian.com)
10 # (C) 2002 Ximian, Inc.
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);
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);
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);
29 freg: OP_LCONV_TO_R8 (lreg) {
30 mono_bblock_add_inst (s->cbb, tree);
33 freg: OP_LCONV_TO_R4 (lreg) {
34 mono_bblock_add_inst (s->cbb, tree);
37 freg: CEE_CONV_R_UN (reg) {
38 mono_bblock_add_inst (s->cbb, tree);
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);
48 reg: OP_LOCALLOC (reg) {
49 mono_bblock_add_inst (s->cbb, tree);
52 stmt: OP_SETRET (reg) {
53 tree->opcode = OP_MOVE;
54 tree->sreg1 = state->left->reg1;
56 mono_bblock_add_inst (s->cbb, tree);
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;
64 mono_bblock_add_inst (s->cbb, tree);
67 stmt: OP_SETRET (freg) {
68 tree->opcode = OP_FMOVE;
69 tree->sreg1 = state->left->reg1;
71 mono_bblock_add_inst (s->cbb, tree);
74 stmt: OP_SETRET (OP_ICONST) {
75 tree->opcode = OP_ICONST;
76 tree->inst_c0 = state->left->tree->inst_c0;
78 mono_bblock_add_inst (s->cbb, tree);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
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);
195 stmt: CEE_STIND_R8 (OP_REGVAR, freg) {
196 /* nothing to do: the value is already on the FP stack */
199 stmt: CEE_BNE_UN (fpcflags) {
200 tree->opcode = OP_FBNE_UN;
201 mono_bblock_add_inst (s->cbb, tree);
204 stmt: CEE_BEQ (fpcflags) {
205 tree->opcode = OP_FBEQ;
206 mono_bblock_add_inst (s->cbb, tree);
209 stmt: CEE_BLT (fpcflags) {
210 tree->opcode = OP_FBLT;
211 mono_bblock_add_inst (s->cbb, tree);
214 stmt: CEE_BLT_UN (fpcflags) {
215 tree->opcode = OP_FBLT_UN;
216 mono_bblock_add_inst (s->cbb, tree);
219 stmt: CEE_BGT (fpcflags) {
220 tree->opcode = OP_FBGT;
221 mono_bblock_add_inst (s->cbb, tree);
224 stmt: CEE_BGT_UN (fpcflags) {
225 tree->opcode = OP_FBGT_UN;
226 mono_bblock_add_inst (s->cbb, tree);
229 stmt: CEE_BGE (fpcflags) {
230 tree->opcode = OP_FBGE;
231 mono_bblock_add_inst (s->cbb, tree);
234 stmt: CEE_BGE_UN (fpcflags) {
235 tree->opcode = OP_FBGE_UN;
236 mono_bblock_add_inst (s->cbb, tree);
239 stmt: CEE_BLE (fpcflags) {
240 tree->opcode = OP_FBLE;
241 mono_bblock_add_inst (s->cbb, tree);
244 stmt: CEE_BLE_UN (fpcflags) {
245 tree->opcode = OP_FBLE_UN;
246 mono_bblock_add_inst (s->cbb, tree);
249 stmt: CEE_POP (freg) "0" {
253 freg: OP_LCONV_TO_R8 (lreg) {
254 /* nothing to do - emulated */
257 freg: OP_LCONV_TO_R_UN (lreg) {
258 /* nothing to do - emulated */
261 freg: OP_FREM (freg, freg) {
262 /* nothing to do - emulated */
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);
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);
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);
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);
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);