2007-11-28 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Wed, 28 Nov 2007 13:13:48 +0000 (13:13 -0000)
committerZoltan Varga <vargaz@gmail.com>
Wed, 28 Nov 2007 13:13:48 +0000 (13:13 -0000)
* mini-x86.c (mono_arch_output_basic_block): Add some micro optimizations.

* mini-x86.c inssel-x86.brg cpu-x86.md: Move the implementation of the
OP_START_HANDLER/OP_ENDFINALLY/OP_ENDFILTER opcodes to mini-x86.c.

svn path=/trunk/mono/; revision=90381

mono/mini/ChangeLog
mono/mini/cpu-x86.md
mono/mini/inssel-x86.brg
mono/mini/mini-x86.c

index 6ac5c21009559f416409897bac9229e44fe36d1e..91bdb7bccf3929e434426cd613300e5b17345b74 100644 (file)
@@ -1,3 +1,10 @@
+2007-11-28  Zoltan Varga  <vargaz@gmail.com>
+
+       * mini-x86.c (mono_arch_output_basic_block): Add some micro optimizations.
+
+       * mini-x86.c inssel-x86.brg cpu-x86.md: Move the implementation of the 
+       OP_START_HANDLER/OP_ENDFINALLY/OP_ENDFILTER opcodes to mini-x86.c.
+
 2007-11-28  Martin Baulig  <martin@ximian.com>
 
        * mini-x86.c
index a1baf5a56f341368c2ef53fb00f27dea8afa280f..205ddaa14e6f17f916cedecffd6cdaeebfe112d5 100644 (file)
@@ -115,6 +115,10 @@ int_xor: dest:i src1:i src2:i len:2 clob:1
 
 throw: src1:i len:13
 op_rethrow: src1:i len:13
+start_handler: len:16
+endfinally: len:16
+op_endfilter: src1:a len:16
+
 ckfinite: dest:f src1:f len:22
 mul.ovf: dest:i src1:i src2:i clob:1 len:9
 # this opcode is handled specially in the code generator
index 831e677b4b830cc513c121f732b8d8ee570daebd..b3b34a20086be8ecbb565c4935f9ecca4884984c 100644 (file)
 # (C) 2002 Ximian, Inc.
 #
 
-stmt: OP_START_HANDLER {
-       MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
-       MONO_EMIT_NEW_STORE_MEMBASE (s, OP_STORE_MEMBASE_REG, spvar->inst_basereg, spvar->inst_offset, X86_ESP);
-}
-
-stmt: OP_ENDFINALLY {
-       MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
-       MONO_EMIT_NEW_LOAD_MEMBASE (s, X86_ESP, spvar->inst_basereg, spvar->inst_offset); 
-       tree->opcode = CEE_RET;
-       mono_bblock_add_inst (s->cbb, tree);
-}
-
+stmt: OP_START_HANDLER,
+stmt: OP_ENDFINALLY,
 stmt: OP_ENDFILTER (reg) {
-       MonoInst *spvar = mono_find_spvar_for_region (s, s->cbb->region);
-       MONO_EMIT_NEW_UNALU (s, OP_MOVE, X86_EAX, state->left->reg1);
-       MONO_EMIT_NEW_LOAD_MEMBASE (s, X86_ESP, spvar->inst_basereg, spvar->inst_offset); 
-       tree->opcode = CEE_RET;
        mono_bblock_add_inst (s->cbb, tree);
 }
 
index 32d5df25b670a5f6e2450c759c078a799c60cb0c..e649ab21388b2e50c9a5bc7b7f41eca1d2120cfb 100644 (file)
@@ -67,13 +67,15 @@ MonoBreakpointInfo
 mono_breakpoint_info [MONO_BREAKPOINT_ARRAY_SIZE];
 
 const char*
-mono_arch_regname (int reg) {
+mono_arch_regname (int reg)
+{
        switch (reg) {
        case X86_EAX: return "%eax";
        case X86_EBX: return "%ebx";
        case X86_ECX: return "%ecx";
        case X86_EDX: return "%edx";
-       case X86_ESP: return "%esp";    case X86_EBP: return "%ebp";
+       case X86_ESP: return "%esp";    
+       case X86_EBP: return "%ebp";
        case X86_EDI: return "%edi";
        case X86_ESI: return "%esi";
        }
@@ -81,8 +83,28 @@ mono_arch_regname (int reg) {
 }
 
 const char*
-mono_arch_fregname (int reg) {
-       return "unknown";
+mono_arch_fregname (int reg)
+{
+       switch (reg) {
+       case 0:
+               return "%fr0";
+       case 1:
+               return "%fr1";
+       case 2:
+               return "%fr2";
+       case 3:
+               return "%fr3";
+       case 4:
+               return "%fr4";
+       case 5:
+               return "%fr5";
+       case 6:
+               return "%fr6";
+       case 7:
+               return "%fr7";
+       default:
+               return "unknown";
+       }
 }
 
 typedef enum {
@@ -2135,14 +2157,15 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
 
                max_len = ((guint8 *)ins_get_spec (ins->opcode))[MONO_INST_LEN];
 
-               if (offset > (cfg->code_size - max_len - 16)) {
+               if (G_UNLIKELY (offset > (cfg->code_size - max_len - 16))) {
                        cfg->code_size *= 2;
                        cfg->native_code = g_realloc (cfg->native_code, cfg->code_size);
                        code = cfg->native_code + offset;
                        mono_jit_stats.code_reallocs++;
                }
 
-               mono_debug_record_line_number (cfg, ins, offset);
+               if (cfg->debug_info)
+                       mono_debug_record_line_number (cfg, ins, offset);
 
                switch (ins->opcode) {
                case OP_BIGMUL:
@@ -2785,6 +2808,25 @@ mono_arch_output_basic_block (MonoCompile *cfg, MonoBasicBlock *bb)
                        x86_alu_reg_imm (code, X86_ADD, X86_ESP, 12);
 #endif
                        break;
+               case OP_START_HANDLER: {
+                       MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       x86_mov_membase_reg (code, spvar->inst_basereg, spvar->inst_offset, X86_ESP, 4);
+                       break;
+               }
+               case OP_ENDFINALLY: {
+                       MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       x86_mov_reg_membase (code, X86_ESP, spvar->inst_basereg, spvar->inst_offset, 4);
+                       x86_ret (code);
+                       break;
+               }
+               case OP_ENDFILTER: {
+                       MonoInst *spvar = mono_find_spvar_for_region (cfg, bb->region);
+                       x86_mov_reg_membase (code, X86_ESP, spvar->inst_basereg, spvar->inst_offset, 4);
+                       /* The local allocator will put the result into EAX */
+                       x86_ret (code);
+                       break;
+               }
+
                case OP_LABEL:
                        ins->inst_c0 = code - cfg->native_code;
                        break;