]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
add "frame" keyword to .ins file syntax
authorAleksey Demakov <ademakov@gmail.com>
Wed, 30 Aug 2006 18:35:10 +0000 (18:35 +0000)
committerAleksey Demakov <ademakov@gmail.com>
Wed, 30 Aug 2006 18:35:10 +0000 (18:35 +0000)
ChangeLog
jit/jit-rules-x86.ins
tools/gen-rules-parser.y
tools/gen-rules-scanner.l

index b8060c2f6e97d19f853757dab3981e38e6a352a5..78c50eea00336482e929c28d42ba16a04642f86e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+2006-08-31  Aleksey Demakov  <ademakov@gmail.com>
+
+       * tools/gen-rules-scanner.l, tools/gen-rules-parser.y: add "frame"
+       keyword that is just like "local" but forces the value out from the
+       register into the stack frame.
+
+       * jit/jit-rules-x86.ins: rewrite JIT_OP_COPY_STORE_BYTE,
+       JIT_OP_ADDRESS_OF, and JIT_OP_COPY_STORE_SHORT rules using the
+       "frame" keyword.
+
 2006-08-30  Aleksey Demakov  <ademakov@gmail.com>
 
        * jit/jit-interp.h, jit/jit-interp.c, jit/jit-opcode.c,
index 923b101aa0011d966399e04e5e6d93323c3616ed..f495913fb26a5c9a7b26d30b533c2c1f508d05ef 100644 (file)
@@ -1629,95 +1629,25 @@ JIT_OP_COPY_STRUCT: manual, spill_before
                gen->posn.ptr = inst;
        }
 
-JIT_OP_COPY_STORE_BYTE: manual
-       [] -> {
-               unsigned char *inst;
-               int reg;
-               _jit_regs_force_out(gen, insn->dest, 1);
-               _jit_gen_fix_value(insn->dest);
-               if(!(insn->value1->is_constant))
-               {
-                       reg = _jit_regs_load_value
-                               (gen, insn->value1, 0,
-                                (insn->flags & (JIT_INSN_VALUE1_NEXT_USE |
-                                                                JIT_INSN_VALUE1_LIVE)));
-                       inst = gen->posn.ptr;
-                       if(!jit_cache_check_for_n(&(gen->posn), 32))
-                       {
-                               jit_cache_mark_full(&(gen->posn));
-                               return;
-                       }
-                       inst = mov_membase_reg_byte
-                               (inst, X86_EBP, insn->dest->frame_offset,
-                                _jit_reg_info[reg].cpu_reg);
-                       gen->posn.ptr = inst;
-               }
-               else
-               {
-                       inst = gen->posn.ptr;
-                       if(!jit_cache_check_for_n(&(gen->posn), 32))
-                       {
-                               jit_cache_mark_full(&(gen->posn));
-                               return;
-                       }
-                       x86_mov_membase_imm(inst, X86_EBP, insn->dest->frame_offset,
-                                                               insn->value1->address, 1);
-                       gen->posn.ptr = inst;
-               }
+JIT_OP_COPY_STORE_BYTE:
+       [=frame, imm] -> {
+               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 1);
+       }
+       [=frame, reg("eax"|"ecx"|"edx"|"edx")] -> {
+               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 1);
        }
 
-JIT_OP_COPY_STORE_SHORT: manual
-       [] -> {
-               unsigned char *inst;
-               int reg;
-               _jit_regs_force_out(gen, insn->dest, 1);
-               _jit_gen_fix_value(insn->dest);
-               if(!(insn->value1->is_constant))
-               {
-                       reg = _jit_regs_load_value
-                               (gen, insn->value1, 0,
-                                (insn->flags & (JIT_INSN_VALUE1_NEXT_USE |
-                                                                JIT_INSN_VALUE1_LIVE)));
-                       inst = gen->posn.ptr;
-                       if(!jit_cache_check_for_n(&(gen->posn), 32))
-                       {
-                               jit_cache_mark_full(&(gen->posn));
-                               return;
-                       }
-                       x86_mov_membase_reg(inst, X86_EBP, insn->dest->frame_offset,
-                                                               _jit_reg_info[reg].cpu_reg, 2);
-                       gen->posn.ptr = inst;
-               }
-               else
-               {
-                       inst = gen->posn.ptr;
-                       if(!jit_cache_check_for_n(&(gen->posn), 32))
-                       {
-                               jit_cache_mark_full(&(gen->posn));
-                               return;
-                       }
-                       x86_mov_membase_imm(inst, X86_EBP, insn->dest->frame_offset,
-                                                               insn->value1->address, 2);
-                       gen->posn.ptr = inst;
-               }
+JIT_OP_COPY_STORE_SHORT:
+       [=frame, imm] -> {
+               x86_mov_membase_imm(inst, X86_EBP, $1, $2, 2);
+       }
+       [=frame, reg] -> {
+               x86_mov_membase_reg(inst, X86_EBP, $1, $2, 2);
        }
 
-JIT_OP_ADDRESS_OF: manual
-       [] -> {
-               unsigned char *inst;
-               int reg;
-               _jit_regs_force_out(gen, insn->value1, 0);
-               _jit_gen_fix_value(insn->value1);
-               reg = _jit_regs_dest_value(gen, insn->dest);
-               inst = gen->posn.ptr;
-               if(!jit_cache_check_for_n(&(gen->posn), 32))
-               {
-                       jit_cache_mark_full(&(gen->posn));
-                       return;
-               }
-               reg = _jit_reg_info[reg].cpu_reg;
-               x86_lea_membase(inst, reg, X86_EBP, insn->value1->frame_offset);
-               gen->posn.ptr = inst;
+JIT_OP_ADDRESS_OF:
+       [=reg, frame] -> {
+               x86_lea_membase(inst, $1, X86_EBP, $2);
        }
 
 /*
index 5f0c372523bdbff64034443c9e9178faa9408f03..95b48b0fe48f5e33563d2432916c4499314d7524 100644 (file)
@@ -141,11 +141,12 @@ static int gensel_first_stack_reg = 8;    /* st0 under x86 */
 #define        GENSEL_PATT_IMMS16                      8
 #define        GENSEL_PATT_IMMU16                      9
 #define        GENSEL_PATT_LOCAL                       10
-#define        GENSEL_PATT_SCRATCH                     11
-#define        GENSEL_PATT_CLOBBER                     12
-#define        GENSEL_PATT_IF                          13
-#define        GENSEL_PATT_SPACE                       14
-#define GENSEL_PATT_ANY                                15
+#define        GENSEL_PATT_FRAME                       11
+#define        GENSEL_PATT_SCRATCH                     12
+#define        GENSEL_PATT_CLOBBER                     13
+#define        GENSEL_PATT_IF                          14
+#define        GENSEL_PATT_SPACE                       15
+#define GENSEL_PATT_ANY                                16
 
 /*
  * Register flags.
@@ -434,6 +435,7 @@ static void gensel_declare_regs(gensel_clause_t clauses, gensel_option_t options
                                break;
 
                        case GENSEL_PATT_LOCAL:
+                       case GENSEL_PATT_FRAME:
                                ++locals;
                                break;
 
@@ -586,6 +588,7 @@ gensel_contains_free_dest(gensel_clause_t clauses, gensel_option_t pattern)
                case GENSEL_PATT_FREG:
                case GENSEL_PATT_LREG:
                case GENSEL_PATT_LOCAL:
+               case GENSEL_PATT_FRAME:
                        if(pattern->flags == GENSEL_FLAG_DEST)
                        {
                                if(index != 0)
@@ -659,6 +662,7 @@ gensel_build_arg_index(
                case GENSEL_PATT_FREG:
                case GENSEL_PATT_LREG:
                case GENSEL_PATT_LOCAL:
+               case GENSEL_PATT_FRAME:
                case GENSEL_PATT_IMMZERO:
                case GENSEL_PATT_IMM:
                case GENSEL_PATT_IMMS8:
@@ -709,6 +713,7 @@ gensel_build_imm_arg_index(
                case GENSEL_PATT_FREG:
                case GENSEL_PATT_LREG:
                case GENSEL_PATT_LOCAL:
+               case GENSEL_PATT_FRAME:
                case GENSEL_PATT_IMMZERO:
                        ++index;
                        break;
@@ -794,6 +799,7 @@ gensel_build_var_index(
                        break;
 
                case GENSEL_PATT_LOCAL:
+               case GENSEL_PATT_FRAME:
                        names[index] = gensel_local_names[locals];
                        ++locals;
                        ++index;
@@ -1077,12 +1083,22 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio
                                        {
                                                printf(" && ");
                                        }
-                                       printf("insn->%s->in_frame && !(insn->%s->in_register)",
+                                       printf("insn->%s->in_frame && !insn->%s->in_register",
                                               args[index], args[index]);
                                        seen_option = 1;
                                        ++index;
                                        break;
 
+                               case GENSEL_PATT_FRAME:
+                                       if(seen_option)
+                                       {
+                                               printf(" && ");
+                                       }
+                                       printf("!insn->%s->is_constant", args[index]);
+                                       seen_option = 1;
+                                       ++index;
+                                       break;
+
                                case GENSEL_PATT_IF:
                                        if(seen_option)
                                        {
@@ -1356,6 +1372,14 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio
                                ++index;
                                break;
 
+                       case GENSEL_PATT_FRAME:
+                               printf("\t\t_jit_regs_force_out(gen, insn->%s, %d);\n",
+                                      args[index], (pattern->flags == GENSEL_FLAG_DEST));
+                               printf("\t\t_jit_gen_fix_value(insn->%s);\n",
+                                      args[index]);
+                               ++index;
+                               break;
+
                        case GENSEL_PATT_SCRATCH:
                                values = pattern->values;
                                while(values)
@@ -1475,7 +1499,6 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio
                        }
                }
 
-
                regs = 0;
                imms = 0;
                locals = 0;
@@ -1523,6 +1546,7 @@ static void gensel_output_clauses(gensel_clause_t clauses, gensel_option_t optio
                                break;
 
                        case GENSEL_PATT_LOCAL:
+                       case GENSEL_PATT_FRAME:
                                printf("\t\t%s = insn->%s->frame_offset;\n",
                                       gensel_local_names[locals], args[index]);
                                ++locals;
@@ -1684,6 +1708,7 @@ static void gensel_output_supported(void)
 %token K_IMMS16                        "immediate signed 16-bit value"
 %token K_IMMU16                        "immediate unsigned 16-bit value"
 %token K_LOCAL                 "local variable"
+%token K_FRAME                 "local variable forced out into the stack frame"
 %token K_BINARY                        "`binary'"
 %token K_UNARY                 "`unary'"
 %token K_UNARY_BRANCH          "`unary_branch'"
@@ -2017,6 +2042,7 @@ InputTag
 
 LocalTag
        : K_LOCAL                       { $$ = GENSEL_PATT_LOCAL; }
+       | K_FRAME                       { $$ = GENSEL_PATT_FRAME; }
        ;
 
 RegTag
index 346a8f388757ea4ba12e946022fd521720b5a0ef..d3b5e325c8baad9058f5af22e779ac56644f7b0f 100644 (file)
@@ -94,6 +94,7 @@ WHITE                 [ \t\v\r\f]
 "imms16"               { RETURNTOK(K_IMMS16); }
 "immu16"               { RETURNTOK(K_IMMU16); }
 "local"                        { RETURNTOK(K_LOCAL); }
+"frame"                        { RETURNTOK(K_FRAME); }
 "binary"               { RETURNTOK(K_BINARY); }
 "unary"                        { RETURNTOK(K_UNARY); }
 "unary_branch"         { RETURNTOK(K_UNARY_BRANCH); }