mirror of
https://github.com/danog/ir.git
synced 2024-11-27 04:45:38 +01:00
Fuse address calculation into store
This commit is contained in:
parent
7552732d65
commit
42df10b3ae
31
ir_x86.dasc
31
ir_x86.dasc
@ -4696,6 +4696,7 @@ static void ir_emit_store_int(ir_ctx *ctx, ir_reg ref, ir_insn *insn)
|
||||
ir_ref type = val_insn->type;
|
||||
ir_reg op2_reg = ctx->regs[ref][2];
|
||||
ir_reg op3_reg = ctx->regs[ref][3];
|
||||
int32_t offset;
|
||||
|
||||
if (IR_IS_CONST_REF(insn->op2)) {
|
||||
void *addr = (void*)ctx->ir_base[insn->op2].val.addr;
|
||||
@ -4716,21 +4717,37 @@ static void ir_emit_store_int(ir_ctx *ctx, ir_reg ref, ir_insn *insn)
|
||||
}
|
||||
}
|
||||
|
||||
IR_ASSERT(op2_reg != IR_REG_NONE);
|
||||
if ((op2_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op2)) {
|
||||
op2_reg &= ~IR_REG_SPILL_LOAD;
|
||||
IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR);
|
||||
ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2);
|
||||
if (op2_reg != IR_REG_NONE) {
|
||||
if ((op2_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op2)) {
|
||||
op2_reg &= ~IR_REG_SPILL_LOAD;
|
||||
IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR);
|
||||
ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2);
|
||||
}
|
||||
offset = 0;
|
||||
} else {
|
||||
ir_insn *addr_insn = &ctx->ir_base[insn->op2];
|
||||
|
||||
if (addr_insn->op == IR_ADD) {
|
||||
op2_reg = ctx->regs[insn->op2][1];
|
||||
IR_ASSERT(op2_reg != IR_REG_NONE);
|
||||
if (op2_reg != IR_REG_NONE && (op2_reg & IR_REG_SPILL_LOAD)) {
|
||||
op2_reg &= ~IR_REG_SPILL_LOAD;
|
||||
ir_emit_load(ctx, IR_ADDR, op2_reg, addr_insn->op1);
|
||||
}
|
||||
offset = ctx->ir_base[addr_insn->op2].val.i32;
|
||||
} else {
|
||||
IR_ASSERT(0);
|
||||
}
|
||||
}
|
||||
if (IR_IS_CONST_REF(insn->op3) && IR_IS_32BIT(type, val_insn->val)) {
|
||||
| ASM_MEM_IMM_OP mov, type, [Ra(op2_reg)], val_insn->val.i32
|
||||
| ASM_MEM_IMM_OP mov, type, [Ra(op2_reg)+offset], val_insn->val.i32
|
||||
} else {
|
||||
IR_ASSERT(op3_reg != IR_REG_NONE);
|
||||
if ((op3_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op3)) {
|
||||
op3_reg &= ~IR_REG_SPILL_LOAD;
|
||||
ir_emit_load(ctx, type, op3_reg, insn->op3);
|
||||
}
|
||||
ir_emit_store_mem_int(ctx, type, op2_reg, 0, op3_reg);
|
||||
ir_emit_store_mem_int(ctx, type, op2_reg, offset, op3_reg);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user