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);
}
/*
#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.
break;
case GENSEL_PATT_LOCAL:
+ case GENSEL_PATT_FRAME:
++locals;
break;
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)
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:
case GENSEL_PATT_FREG:
case GENSEL_PATT_LREG:
case GENSEL_PATT_LOCAL:
+ case GENSEL_PATT_FRAME:
case GENSEL_PATT_IMMZERO:
++index;
break;
break;
case GENSEL_PATT_LOCAL:
+ case GENSEL_PATT_FRAME:
names[index] = gensel_local_names[locals];
++locals;
++index;
{
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)
{
++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)
}
}
-
regs = 0;
imms = 0;
locals = 0;
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;
%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'"
LocalTag
: K_LOCAL { $$ = GENSEL_PATT_LOCAL; }
+ | K_FRAME { $$ = GENSEL_PATT_FRAME; }
;
RegTag