X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-arm.c;h=68a3e6c9aa708023cfbd4b2f811e86b98d729678;hb=dba1e96418a00b863db3565d5997314105bd8aa3;hp=b56db4a2fd052649bc3ae0792f20dd07611ed126;hpb=d49951ccf584ba637afb1dab7fff714478e3174d;p=mono.git diff --git a/mono/mini/mini-arm.c b/mono/mini/mini-arm.c index b56db4a2fd0..68a3e6c9aa7 100644 --- a/mono/mini/mini-arm.c +++ b/mono/mini/mini-arm.c @@ -399,22 +399,30 @@ add_general (guint *gr, guint *stack_size, ArgInfo *ainfo, gboolean simple) ainfo->reg = *gr; } } else { - if (*gr == ARMREG_R3) { + if (*gr == ARMREG_R3 +#ifdef __ARM_EABI__ + && 0 +#endif + ) { /* first word in r3 and the second on the stack */ ainfo->offset = *stack_size; ainfo->reg = ARMREG_SP; /* in the caller */ ainfo->regtype = RegTypeBaseGen; *stack_size += 4; } else if (*gr > ARMREG_R3) { - /**stack_size += 7; - *stack_size &= ~7;*/ +#ifdef __ARM_EABI__ + *stack_size += 7; + *stack_size &= ~7; +#endif ainfo->offset = *stack_size; ainfo->reg = ARMREG_SP; /* in the caller */ ainfo->regtype = RegTypeBase; *stack_size += 8; } else { - /*if ((*gr) & 1) - (*gr) ++;*/ +#ifdef __ARM_EABI__ + if ((*gr) & 1) + (*gr) ++; +#endif ainfo->reg = *gr; } (*gr) ++; @@ -738,7 +746,7 @@ mono_arch_allocate_vars (MonoCompile *m) curinst = 0; if (sig->hasthis) { - inst = m->varinfo [curinst]; + inst = m->args [curinst]; if (inst->opcode != OP_REGVAR) { inst->opcode = OP_REGOFFSET; inst->inst_basereg = frame_reg; @@ -753,7 +761,7 @@ mono_arch_allocate_vars (MonoCompile *m) } for (i = 0; i < sig->param_count; ++i) { - inst = m->varinfo [curinst]; + inst = m->args [curinst]; if (inst->opcode != OP_REGVAR) { inst->opcode = OP_REGOFFSET; inst->inst_basereg = frame_reg; @@ -1173,15 +1181,8 @@ peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb) if (last_ins && (last_ins->opcode == OP_STOREI1_MEMBASE_REG) && ins->inst_basereg == last_ins->inst_destbasereg && ins->inst_offset == last_ins->inst_offset) { - if (ins->dreg == last_ins->sreg1) { - last_ins->next = ins->next; - ins = ins->next; - continue; - } else { - //static int c = 0; printf ("MATCHX %s %d\n", cfg->method->name,c++); - ins->opcode = OP_MOVE; - ins->sreg1 = last_ins->sreg1; - } + ins->opcode = (ins->opcode == OP_LOADI1_MEMBASE) ? CEE_CONV_I1 : CEE_CONV_U1; + ins->sreg1 = last_ins->sreg1; } break; case OP_LOADU2_MEMBASE: @@ -1189,15 +1190,8 @@ peephole_pass (MonoCompile *cfg, MonoBasicBlock *bb) if (last_ins && (last_ins->opcode == OP_STOREI2_MEMBASE_REG) && ins->inst_basereg == last_ins->inst_destbasereg && ins->inst_offset == last_ins->inst_offset) { - if (ins->dreg == last_ins->sreg1) { - last_ins->next = ins->next; - ins = ins->next; - continue; - } else { - //static int c = 0; printf ("MATCHX %s %d\n", cfg->method->name,c++); - ins->opcode = OP_MOVE; - ins->sreg1 = last_ins->sreg1; - } + ins->opcode = (ins->opcode == OP_LOADI2_MEMBASE) ? CEE_CONV_I2 : CEE_CONV_U2; + ins->sreg1 = last_ins->sreg1; } break; case CEE_CONV_I4: @@ -1356,8 +1350,8 @@ mono_arch_lowering_pass (MonoCompile *cfg, MonoBasicBlock *bb) int rot_amount, imm8, low_imm; /* setup the virtual reg allocator */ - if (bb->max_ireg > cfg->rs->next_vireg) - cfg->rs->next_vireg = bb->max_ireg; + if (bb->max_vreg > cfg->rs->next_vreg) + cfg->rs->next_vreg = bb->max_vreg; ins = bb->code; while (ins) { @@ -1502,7 +1496,7 @@ loop_start: ins = ins->next; } bb->last_ins = last_ins; - bb->max_ireg = cfg->rs->next_vireg; + bb->max_vreg = cfg->rs->next_vreg; } @@ -1844,7 +1838,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) while (ins) { offset = code - cfg->native_code; - max_len = ((guint8 *)arm_cpu_desc [ins->opcode])[MONO_INST_LEN]; + max_len = ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN]; if (offset > (cfg->code_size - max_len - 16)) { cfg->code_size *= 2; @@ -1992,7 +1986,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) g_assert (imm8 >= 0); ARM_CMP_REG_IMM (code, ins->sreg1, imm8, rot_amount); break; - case CEE_BREAK: + case OP_BREAK: *(int*)code = 0xe7f001f0; *(int*)code = 0xef9f0001; code += 4; @@ -2207,7 +2201,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) ARM_CVTS (code, ins->dreg, ins->dreg); #endif break; - case CEE_JMP: + case OP_JMP: /* * Keep in sync with mono_arch_emit_epilog */ @@ -2304,7 +2298,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) g_assert_not_reached (); ARM_MOV_REG_REG (code, ARMREG_PC, ARMREG_LR); break; - case CEE_THROW: { + case OP_THROW: { if (ins->sreg1 != ARMREG_R0) ARM_MOV_REG_REG (code, ARMREG_R0, ins->sreg1); mono_add_patch_info (cfg, code - cfg->native_code, MONO_PATCH_INFO_INTERNAL_METHOD, @@ -2356,7 +2350,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) } ARM_MOV_REG_REG (code, ARMREG_PC, ARMREG_IP); break; - case CEE_ENDFINALLY: + case OP_ENDFINALLY: if (arm_is_imm12 (ins->inst_left->inst_offset)) { ARM_LDR_IMM (code, ARMREG_IP, ins->inst_left->inst_basereg, ins->inst_left->inst_offset); } else { @@ -2373,7 +2367,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) case OP_LABEL: ins->inst_c0 = code - cfg->native_code; break; - case CEE_BR: + case OP_BR: if (ins->flags & MONO_INST_BRLABEL) { /*if (ins->inst_i0->inst_c0) { ARM_B (code, 0); @@ -2810,7 +2804,7 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb) EMIT_COND_BRANCH_FLAGS (ins, ARMCOND_VS); /* V set */ EMIT_COND_BRANCH_FLAGS (ins, ARMCOND_GE); /* swapped */ break; - case CEE_CKFINITE: { + case OP_CKFINITE: { /*ppc_stfd (code, ins->sreg1, -8, ppc_sp); ppc_lwz (code, ppc_r11, -8, ppc_sp); ppc_rlwinm (code, ppc_r11, ppc_r11, 0, 1, 31); @@ -3011,7 +3005,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) max_offset += 6; while (ins) { - max_offset += ((guint8 *)arm_cpu_desc [ins->opcode])[MONO_INST_LEN]; + max_offset += ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN]; ins = ins->next; } } @@ -3029,7 +3023,7 @@ mono_arch_emit_prolog (MonoCompile *cfg) } for (i = 0; i < sig->param_count + sig->hasthis; ++i) { ArgInfo *ainfo = cinfo->args + i; - inst = cfg->varinfo [pos]; + inst = cfg->args [pos]; if (cfg->verbose_level > 2) g_print ("Saving argument %d (type: %d)\n", i, ainfo->regtype); @@ -3223,7 +3217,7 @@ mono_arch_emit_epilog (MonoCompile *cfg) } /* - * Keep in sync with CEE_JMP + * Keep in sync with OP_JMP */ code = cfg->native_code + cfg->code_len;