From: Aleksey Demakov Date: Wed, 30 Aug 2006 18:35:10 +0000 (+0000) Subject: add "frame" keyword to .ins file syntax X-Git-Tag: before.move.to.git~199 X-Git-Url: https://git.unchartedbackwaters.co.uk/w/?a=commitdiff_plain;h=96011fd558f78655fc6245e0d1b75cbfba8ea5d0;p=francis%2Flibjit.git add "frame" keyword to .ins file syntax --- diff --git a/ChangeLog b/ChangeLog index b8060c2..78c50ee 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2006-08-31 Aleksey Demakov + + * 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 * jit/jit-interp.h, jit/jit-interp.c, jit/jit-opcode.c, diff --git a/jit/jit-rules-x86.ins b/jit/jit-rules-x86.ins index 923b101..f495913 100644 --- a/jit/jit-rules-x86.ins +++ b/jit/jit-rules-x86.ins @@ -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); } /* diff --git a/tools/gen-rules-parser.y b/tools/gen-rules-parser.y index 5f0c372..95b48b0 100644 --- a/tools/gen-rules-parser.y +++ b/tools/gen-rules-parser.y @@ -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 diff --git a/tools/gen-rules-scanner.l b/tools/gen-rules-scanner.l index 346a8f3..d3b5e32 100644 --- a/tools/gen-rules-scanner.l +++ b/tools/gen-rules-scanner.l @@ -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); }