4 # inssel-s390x.brg: burg file for special s390 instructions
7 # Neale Ferguson (Neale.Ferguson@SoftwareAG-usa.com)
8 # Dietmar Maurer (dietmar@ximian.com)
9 # Paolo Molaro (lupus@ximian.com)
11 # (C) 2002 Ximian, Inc.
14 stmt: OP_START_HANDLER {
15 MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
16 tree->inst_left = spvar;
17 mono_bblock_add_inst (s->cbb, tree);
20 stmt: CEE_ENDFINALLY {
21 MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
22 tree->inst_left = spvar;
23 mono_bblock_add_inst (s->cbb, tree);
26 stmt: OP_ENDFILTER (reg) {
27 MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
28 tree->inst_left = spvar;
29 tree->sreg1 = state->left->reg1;
30 mono_bblock_add_inst (s->cbb, tree);
33 reg: CEE_ADD_OVF (reg, reg) "0" {
34 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
37 reg: CEE_ADD_OVF_UN (reg, reg) "0" {
38 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
41 reg: CEE_SUB_OVF (reg, reg) "0" {
42 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
45 reg: CEE_SUB_OVF_UN (reg, reg) "0" {
46 MONO_EMIT_BIALU (s, tree, tree->opcode, state->reg1, state->left->reg1, state->right->reg1);
49 stmt: CEE_STIND_I8 (OP_REGVAR, reg) {
50 MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->left->tree->dreg, state->right->reg1);
51 // MONO_EMIT_NEW_UNALU (s, OP_MOVE, s390_r2, state->right->reg1);
54 reg: CEE_LDIND_I8 (OP_REGVAR) {
55 MONO_EMIT_NEW_UNALU (s, OP_MOVE, state->reg1, state->left->tree->dreg);
58 freg: OP_LCONV_TO_R8 (lreg) {
59 tree->dreg = state->reg1;
60 tree->sreg1 = state->left->reg1;
61 tree->sreg2 = state->left->reg2;
62 mono_bblock_add_inst (s->cbb, tree);
65 freg: OP_LCONV_TO_R4 (lreg) {
66 tree->dreg = state->reg1;
67 tree->sreg1 = state->left->reg1;
68 tree->sreg2 = state->left->reg2;
69 mono_bblock_add_inst (s->cbb, tree);
72 freg: CEE_CONV_R_UN (reg) {
73 tree->dreg = state->reg1;
74 tree->sreg1 = state->left->reg1;
75 mono_bblock_add_inst (s->cbb, tree);
78 freg: CEE_CONV_R_UN (reg) {
79 mono_bblock_add_inst (s->cbb, tree);
82 stmt: OP_MEMCPY (reg, reg) "0" {
83 int size = tree->unused;
85 MONO_EMIT_NEW_MOVE (s, state->left->reg1, 0, state->right->reg1, 0, size);
88 reg: OP_LOCALLOC (OP_ICONST) {
89 /* microcoded in mini-s390.c */
90 tree->sreg1 = mono_regstate_next_int (s->rs);
91 tree->dreg = state->reg1;
92 MONO_EMIT_NEW_ICONST (s, tree->sreg1, state->left->tree->inst_c0);
93 mono_bblock_add_inst (s->cbb, tree);
96 reg: OP_LOCALLOC (reg) {
97 tree->dreg = state->reg1;
98 tree->sreg1 = state->left->reg1;
99 mono_bblock_add_inst (s->cbb, tree);
102 stmt: OP_SETRET (reg) {
103 tree->opcode = OP_MOVE;
104 tree->sreg1 = state->left->reg1;
105 tree->dreg = s390_r2;
106 mono_bblock_add_inst (s->cbb, tree);
109 # stmt: OP_SETRET (lreg) {
110 # tree->opcode = OP_MOVE;
111 # tree->sreg1 = state->left->reg1;
112 # tree->dreg = s390_r2;
113 # mono_bblock_add_inst (s->cbb, tree);
116 stmt: OP_SETRET (freg) {
117 if (mono_method_signature (s->method)->ret->type == MONO_TYPE_R4) {
118 tree->opcode = OP_S390_SETF4RET;
119 tree->sreg1 = state->left->reg1;
120 tree->dreg = s390_f0;
122 tree->opcode = OP_FMOVE;
123 tree->sreg1 = state->left->reg1;
124 tree->dreg = s390_f0;
126 mono_bblock_add_inst (s->cbb, tree);
129 stmt: OP_SETRET (OP_ICONST) {
130 tree->opcode = OP_ICONST;
131 tree->inst_c0 = state->left->tree->inst_c0;
132 tree->dreg = s390_r2;
133 mono_bblock_add_inst (s->cbb, tree);
136 stmt: OP_OUTARG (reg) {
137 if (tree->inst_imm) {
138 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, STK_BASE, tree->inst_imm, state->left->reg1);
141 tree->opcode = OP_SETREG;
142 tree->dreg = tree->unused;
143 tree->sreg1 = state->left->reg1;
144 mono_bblock_add_inst (s->cbb, tree);
147 stmt: OP_OUTARG (OP_REGVAR) {
148 if (tree->inst_imm) {
149 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, STK_BASE, tree->inst_imm, state->left->tree->dreg);
152 tree->opcode = OP_SETREG;
153 tree->dreg = tree->unused;
154 tree->sreg1 = state->left->tree->dreg;
155 mono_bblock_add_inst (s->cbb, tree);
158 stmt: OP_OUTARG (OP_I8CONST) {
159 if (tree->inst_imm) {
160 MONO_EMIT_NEW_STORE_MEMBASE_IMM (s, OP_STORE_MEMBASE_IMM,
161 STK_BASE, tree->inst_imm,
162 state->left->tree->inst_c0);
165 tree->opcode = OP_SETREGIMM;
166 tree->dreg = tree->unused;
167 tree->inst_c0 = state->left->tree->inst_c0;
168 mono_bblock_add_inst (s->cbb, tree);
171 stmt: OP_OUTARG (OP_ICONST) {
172 if (tree->inst_imm) {
173 MONO_EMIT_NEW_STORE_MEMBASE_IMM (s, OP_STOREI4_MEMBASE_IMM,
174 STK_BASE, tree->inst_imm,
175 state->left->tree->inst_c0);
178 tree->opcode = OP_SETREGIMM;
179 tree->dreg = tree->unused;
180 tree->inst_c0 = state->left->tree->inst_c0;
181 mono_bblock_add_inst (s->cbb, tree);
184 stmt: OP_OUTARG (CEE_LDIND_REF (OP_REGVAR)) {
185 if (tree->inst_imm) {
186 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, STK_BASE, tree->inst_imm, state->left->left->tree->dreg);
189 tree->opcode = OP_SETREG;
190 tree->sreg1 = state->left->left->tree->dreg;
191 tree->dreg = tree->unused;
192 mono_bblock_add_inst (s->cbb, tree);
195 stmt: OP_OUTARG (CEE_LDIND_I (OP_REGVAR)) {
196 tree->opcode = OP_SETREG;
197 tree->dreg = tree->unused;
198 tree->sreg1 = state->left->left->tree->dreg;
199 mono_bblock_add_inst (s->cbb, tree);
202 stmt: OP_OUTARG (CEE_LDIND_I8 (OP_REGVAR)) {
203 tree->opcode = OP_SETREG;
204 tree->dreg = tree->unused;
205 tree->sreg1 = state->left->left->tree->dreg;
206 mono_bblock_add_inst (s->cbb, tree);
209 stmt: OP_OUTARG (CEE_LDIND_I4 (OP_REGVAR)) {
210 tree->opcode = OP_SETREG;
211 tree->dreg = tree->unused;
212 tree->sreg1 = state->left->left->tree->dreg;
213 mono_bblock_add_inst (s->cbb, tree);
216 stmt: OP_OUTARG (CEE_LDIND_I (base)) {
217 MONO_EMIT_LOAD_MEMBASE (s, tree, tree->unused,
218 state->left->left->tree->inst_basereg,
219 state->left->left->tree->inst_offset);
220 mono_bblock_add_inst (s->cbb, tree);
223 stmt: OP_OUTARG (CEE_LDIND_I4 (base)) {
224 MONO_EMIT_LOAD_MEMBASE_OP (s, tree, OP_LOADI4_MEMBASE,
225 tree->unused, state->left->left->tree->inst_basereg,
226 state->left->left->tree->inst_offset);
227 mono_bblock_add_inst (s->cbb, tree);
230 stmt: OP_OUTARG (OP_LDADDR (OP_S390_LOADARG)) {
231 if (tree->inst_imm) {
232 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, STK_BASE,
234 state->left->left->tree->dreg);
237 MONO_EMIT_BIALU_IMM (s, tree, OP_ADD_IMM, tree->unused,
238 state->left->left->tree->sreg1,
239 state->left->left->tree->inst_offset);
242 stmt: OP_OUTARG (freg) {
243 if (tree->inst_imm) {
244 /*----------------------------------------------*/
245 /* The length stored in unused tells us whether */
246 /* we need to store a float or a double */
247 /*----------------------------------------------*/
248 if ((tree->unused & 0xff00) == 0x0400) {
249 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER4_MEMBASE_REG,
250 STK_BASE, tree->inst_imm,
253 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER8_MEMBASE_REG,
254 STK_BASE, tree->inst_imm,
259 tree->opcode = OP_SETFREG;
260 tree->sreg1 = state->left->reg1;
261 tree->dreg = tree->unused;
262 mono_bblock_add_inst (s->cbb, tree);
265 stmt: OP_OUTARG_R4 (freg) {
266 if (tree->inst_imm) {
267 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER4_MEMBASE_REG, STK_BASE, tree->inst_imm, state->left->reg1);
270 tree->opcode = OP_SETFREG;
271 tree->sreg1 = state->left->reg1;
272 tree->dreg = tree->unused;
273 mono_bblock_add_inst (s->cbb, tree);
276 stmt: OP_OUTARG_R8 (freg) {
277 if (tree->inst_imm) {
278 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORER8_MEMBASE_REG, STK_BASE, tree->inst_imm, state->left->reg1);
281 tree->opcode = OP_SETFREG;
282 tree->sreg1 = state->left->reg1;
283 tree->dreg = tree->unused;
284 mono_bblock_add_inst (s->cbb, tree);
287 stmt: OP_OUTARG_VT (CEE_LDOBJ (base)) {
288 MonoInst *vt = state->left->left->tree;
289 int start_reg = tree->sreg1;
290 int size = tree->unused;
291 int soffset = vt->inst_offset;
294 //printf("OP_OUTARG_VT(CEE_LDOBJ(base))\n");
297 if (start_reg != STK_BASE) {
298 MONO_EMIT_NEW_MOVE(s, STK_BASE, tree->sreg2,
299 vt->inst_basereg, soffset, size);
300 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg,
301 STK_BASE, tree->sreg2);
303 MONO_EMIT_NEW_MOVE(s, STK_BASE, tree->sreg2+sizeof(gpointer),
304 vt->inst_basereg, soffset, size);
305 tmpr = mono_regstate_next_int (s->rs);
306 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
307 tree->sreg2+sizeof(gpointer));
308 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG,
309 STK_BASE, tree->sreg2, tmpr);
312 if (start_reg != STK_BASE) {
313 MONO_OUTPUT_VTR (s, size, start_reg, vt->inst_basereg, soffset);
315 MONO_OUTPUT_VTS (s, size, STK_BASE, tree->inst_imm,
316 vt->inst_basereg, soffset);
321 stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_S390_ARGPTR)) {
322 MonoInst *vt = state->left->left->tree;
323 int start_reg = tree->sreg1;
324 int size = tree->unused;
325 int soffset = vt->inst_offset;
328 //printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_ARGPTR))\n");
331 if (start_reg != STK_BASE) {
332 MONO_EMIT_NEW_MOVE (s, STK_BASE, tree->inst_imm,
333 vt->inst_basereg, soffset, size);
334 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg,
335 STK_BASE, tree->sreg2);
337 MONO_EMIT_NEW_MOVE (s, STK_BASE,
338 tree->inst_imm+sizeof(gpointer),
339 vt->inst_basereg, soffset, size);
340 tmpr = mono_regstate_next_int (s->rs);
341 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
342 tree->inst_imm+sizeof(gpointer));
343 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG,
344 STK_BASE, tree->inst_imm,
348 if (start_reg != STK_BASE) {
349 MONO_OUTPUT_VTR (s, size, start_reg, vt->inst_basereg, soffset);
351 MONO_OUTPUT_VTS (s, size, STK_BASE,
353 vt->inst_basereg, soffset);
358 stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_REGOFFSET)) "0" {
359 MonoInst *vt = state->left->left->tree;
360 int start_reg = tree->sreg1;
361 int size = tree->unused;
362 int soffset = vt->inst_offset;
365 //printf("OP_OUTARG_VT(CEE_LDOBJ(OP_REGOFFSET))\n");
368 if (start_reg != STK_BASE) {
369 MONO_EMIT_NEW_MOVE (s, STK_BASE, tree->sreg2,
370 vt->inst_basereg, soffset, size);
371 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg,
372 STK_BASE, tree->sreg2);
374 MONO_EMIT_NEW_MOVE (s, STK_BASE,
375 tree->sreg2+sizeof(gpointer),
376 vt->inst_basereg, soffset, size);
377 tmpr = mono_regstate_next_int (s->rs);
378 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
379 tree->sreg2+sizeof(gpointer));
380 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG,
381 STK_BASE, tree->sreg2,
385 if (start_reg != STK_BASE) {
386 MONO_OUTPUT_VTR(s, size, start_reg, vt->inst_basereg, soffset);
388 MONO_OUTPUT_VTS(s, size, STK_BASE, tree->inst_imm,
389 vt->inst_basereg, soffset);
394 stmt: OP_OUTARG_VT (CEE_LDOBJ (OP_S390_LOADARG)) {
395 MonoInst *vt = state->left->left->tree;
396 int start_reg = tree->sreg1;
397 int size = -tree->unused;
398 int soffset = vt->inst_offset;
401 //printf("OP_OUTARG_VT(CEE_LDOBJ(OP_S390_LOADARG))\n");
402 if (start_reg != STK_BASE) {
403 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg, STK_BASE, soffset);
404 MONO_EMIT_NEW_MOVE (s, STK_BASE, tree->sreg2, start_reg, 0, size);
405 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg,
406 STK_BASE, tree->sreg2);
408 MONO_EMIT_NEW_MOVE (s, STK_BASE,
409 tree->inst_imm+sizeof(gpointer),
410 vt->inst_basereg, soffset, size);
411 tmpr = mono_regstate_next_int (s->rs);
412 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
413 tree->inst_imm+sizeof(gpointer));
414 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG,
415 STK_BASE, tree->inst_imm,
420 stmt: OP_OUTARG_VT (OP_ICONST) {
421 int start_reg = tree->sreg1;
422 int size = tree->unused;
423 int nregs = size / 4;
425 //printf("OP_OUTARG_VT(OP_ICONST)\n");
426 if (start_reg != STK_BASE) {
428 tree->opcode = OP_SETREGIMM;
429 tree->dreg = start_reg;
430 tree->inst_c0 = state->left->tree->inst_c0;
431 mono_bblock_add_inst (s->cbb, tree);
434 MONO_OUTPUT_VTS (s, size, STK_BASE, tree->inst_c0,
435 s->frame_reg, tree->inst_offset);
439 stmt: OP_OUTARG_VT (reg) {
440 int start_reg = tree->sreg1;
441 int size = tree->unused;
442 int soffset = tree->sreg2;
445 //printf("OP_OUTARG_VT(reg)\n");
448 if (start_reg != STK_BASE) {
449 MONO_EMIT_NEW_MOVE (s, STK_BASE, soffset,
450 state->left->tree->sreg1,
451 tree->inst_imm, size);
452 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, start_reg,
455 MONO_EMIT_NEW_MOVE (s, STK_BASE,
456 soffset+sizeof(gpointer),
457 state->left->tree->sreg1,
458 tree->inst_imm, size);
459 tmpr = mono_regstate_next_int (s->rs);
460 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
461 soffset+sizeof(gpointer));
462 MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG,
463 STK_BASE, tree->inst_imm,
467 if (start_reg != STK_BASE) {
468 MONO_OUTPUT_VTR (s, size, start_reg, STK_BASE,
469 state->left->tree->inst_offset);
471 MONO_OUTPUT_VTS (s, size, STK_BASE, soffset, tmpr,
472 state->left->tree->inst_offset);
473 tmpr = mono_regstate_next_int (s->rs);
474 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, STK_BASE,
480 stmt: CEE_STIND_R8 (OP_REGVAR, freg) {
481 /* nothing to do: the value is already on the FP stack */
484 stmt: CEE_BNE_UN (fpcflags) {
485 tree->opcode = OP_FBNE_UN;
486 mono_bblock_add_inst (s->cbb, tree);
489 stmt: CEE_BEQ (fpcflags) {
490 tree->opcode = OP_FBEQ;
491 mono_bblock_add_inst (s->cbb, tree);
494 stmt: CEE_BLT (fpcflags) {
495 tree->opcode = OP_FBLT;
496 mono_bblock_add_inst (s->cbb, tree);
499 stmt: CEE_BLT_UN (fpcflags) {
500 tree->opcode = OP_FBLT_UN;
501 mono_bblock_add_inst (s->cbb, tree);
504 stmt: CEE_BGT (fpcflags) {
505 tree->opcode = OP_FBGT;
506 mono_bblock_add_inst (s->cbb, tree);
509 stmt: CEE_BGT_UN (fpcflags) {
510 tree->opcode = OP_FBGT_UN;
511 mono_bblock_add_inst (s->cbb, tree);
514 stmt: CEE_BGE (fpcflags) {
515 tree->opcode = OP_FBGE;
516 mono_bblock_add_inst (s->cbb, tree);
519 stmt: CEE_BGE_UN (fpcflags) {
520 tree->opcode = OP_FBGE_UN;
521 mono_bblock_add_inst (s->cbb, tree);
524 stmt: CEE_BLE (fpcflags) {
525 tree->opcode = OP_FBLE;
526 mono_bblock_add_inst (s->cbb, tree);
529 stmt: CEE_BLE_UN (fpcflags) {
530 tree->opcode = OP_FBLE_UN;
531 mono_bblock_add_inst (s->cbb, tree);
534 stmt: CEE_POP (freg) "0" {
538 freg: OP_LCONV_TO_R8 (lreg) {
539 /* nothing to do - emulated */
542 freg: OP_LCONV_TO_R4 (lreg) {
543 /* nothing to do - emulated */
546 freg: OP_LCONV_TO_R_UN (lreg) {
547 /* nothing to do - emulated */
550 freg: OP_FREM (freg, freg) {
551 /* nothing to do - emulated */
554 reg: OP_CEQ (OP_COMPARE (freg, freg)) {
555 MONO_EMIT_BIALU (s, tree, OP_FCEQ, state->reg1, state->left->left->reg1,
556 state->left->right->reg1);
559 reg: OP_CLT (OP_COMPARE (freg, freg)) {
560 MONO_EMIT_BIALU (s, tree, OP_FCLT, state->reg1, state->left->left->reg1,
561 state->left->right->reg1);
564 reg: OP_CLT_UN (OP_COMPARE (freg, freg)) {
565 MONO_EMIT_BIALU (s, tree, OP_FCLT_UN, state->reg1, state->left->left->reg1,
566 state->left->right->reg1);
569 reg: OP_CGT (OP_COMPARE (freg, freg)) {
570 MONO_EMIT_BIALU (s, tree, OP_FCGT, state->reg1, state->left->left->reg1,
571 state->left->right->reg1);
574 reg: OP_CGT_UN (OP_COMPARE (freg, freg)) {
575 MONO_EMIT_BIALU (s, tree, OP_FCGT_UN, state->reg1, state->left->left->reg1,
576 state->left->right->reg1);
579 base: OP_S390_STKARG "0" {
582 tmpr = mono_regstate_next_int (s->rs);
583 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg,
584 (s->stack_offset+state->tree->unused));
585 tree->inst_offset = state->tree->inst_offset;
586 tree->inst_basereg = tmpr;
589 base: OP_LDADDR (OP_S390_LOADARG) "0" {
592 tmpr = mono_regstate_next_int (s->rs);
593 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg,
594 state->left->tree->inst_offset);
595 tree->inst_offset = 0;
596 tree->inst_basereg = tmpr;
599 base: OP_LDADDR (OP_S390_ARGPTR) "0" {
602 tmpr = mono_regstate_next_int (s->rs);
603 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg,
604 state->left->tree->inst_offset);
605 tree->inst_offset = 0;
606 tree->inst_basereg = tmpr;
609 base: OP_LDADDR (OP_S390_STKARG) "0" {
612 tmpr = mono_regstate_next_int (s->rs);
613 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg,
614 (s->stack_offset + state->left->tree->unused));
615 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, tmpr,
616 state->left->tree->inst_offset);
617 tree->inst_offset = 0;
618 tree->inst_basereg = tmpr;
621 reg: OP_LDADDR (OP_S390_LOADARG) "2" {
622 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
623 state->left->tree->inst_offset);
624 tree->inst_offset = 0;
625 tree->inst_basereg = state->reg1;
628 reg: OP_LDADDR (OP_S390_ARGPTR) "2" {
629 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
630 state->left->tree->inst_offset);
631 tree->inst_offset = 0;
632 tree->inst_basereg = state->reg1;
635 reg: OP_LDADDR (OP_S390_STKARG) "2" {
636 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
637 (s->stack_offset + state->left->tree->unused));
638 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->reg1,
639 state->left->tree->inst_offset);
640 tree->inst_offset = 0;
641 tree->inst_basereg = state->reg1;
644 reg: CEE_LDOBJ (OP_S390_LOADARG) "1" {
645 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
646 state->left->tree->inst_offset);
649 reg: CEE_LDOBJ (OP_S390_ARGPTR) "1" {
650 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
651 state->left->tree->inst_offset);
654 reg: CEE_LDOBJ (OP_S390_STKARG) "1" {
655 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, s->frame_reg,
656 (s->stack_offset + state->left->tree->unused));
657 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, state->reg1, state->reg1,
658 state->left->tree->inst_offset);
659 tree->inst_offset = 0;
660 tree->dreg = state->reg1;
663 base: CEE_LDOBJ (OP_S390_ARGPTR) "0" {
666 tmpr = mono_regstate_next_int (s->rs);
667 MONO_EMIT_NEW_LOAD_MEMBASE (s, tmpr, s->frame_reg,
668 state->left->tree->inst_offset);
669 tree->inst_offset = 0;
673 base: CEE_LDOBJ (OP_S390_STKARG) "0" {
676 tmpr = mono_regstate_next_int (s->rs);
677 MONO_EMIT_NEW_BIALU_IMM (s, OP_ADD_IMM, tmpr, s->frame_reg,
678 (s->stack_offset + state->left->tree->unused));
679 MONO_EMIT_NEW_LOAD_MEMBASE (s, tmpr, tmpr, state->left->tree->inst_offset);
680 tree->inst_offset = 0;
681 tree->inst_basereg = tmpr;