From 0a93d2e41b5561eee267a4db4599c8dbfb250abd Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 14 Jun 2022 20:51:39 +0300 Subject: [PATCH] Fix incorrect type usage --- ir_aarch64.dasc | 12 ++++++++---- ir_x86.dasc | 15 ++++++++++----- 2 files changed, 18 insertions(+), 9 deletions(-) diff --git a/ir_aarch64.dasc b/ir_aarch64.dasc index d627687..341d818 100644 --- a/ir_aarch64.dasc +++ b/ir_aarch64.dasc @@ -2870,11 +2870,13 @@ static void ir_emit_load_int(ir_ctx *ctx, ir_ref def, ir_insn *insn) IR_ASSERT(def_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, type, op2_reg, insn->op2); + 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) { op2_reg = def_reg; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } ir_emit_load_mem_int(ctx, type, def_reg, op2_reg, 0); if (ctx->regs[def][0] & IR_REG_SPILL_STORE) { @@ -2909,7 +2911,8 @@ static void ir_emit_store_int(ir_ctx *ctx, ir_reg ref, ir_insn *insn) IR_ASSERT(op2_reg != IR_REG_NONE && op3_reg != IR_REG_NONE); if (op2_reg & IR_REG_SPILL_LOAD) { op2_reg &= ~IR_REG_SPILL_LOAD; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } if ((op3_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op3)) { op3_reg &= ~IR_REG_SPILL_LOAD; @@ -2927,7 +2930,8 @@ static void ir_emit_store_fp(ir_ctx *ctx, ir_ref ref, ir_insn *insn) IR_ASSERT(op2_reg != IR_REG_NONE && op3_reg != IR_REG_NONE); if (op2_reg & IR_REG_SPILL_LOAD) { op2_reg &= ~IR_REG_SPILL_LOAD; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } if ((op3_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op3)) { op3_reg &= ~IR_REG_SPILL_LOAD; diff --git a/ir_x86.dasc b/ir_x86.dasc index 9867083..e184935 100644 --- a/ir_x86.dasc +++ b/ir_x86.dasc @@ -4259,11 +4259,13 @@ static void ir_emit_load_int(ir_ctx *ctx, ir_ref def, ir_insn *insn) IR_ASSERT(def_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, type, op2_reg, insn->op2); + 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) { op2_reg = def_reg; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } ir_emit_load_mem_int(ctx, type, def_reg, op2_reg, 0); if (ctx->regs[def][0] & IR_REG_SPILL_STORE) { @@ -4280,7 +4282,8 @@ static void ir_emit_load_fp(ir_ctx *ctx, ir_ref def, ir_insn *insn) IR_ASSERT(def_reg != IR_REG_NONE && 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, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } ir_emit_load_mem_fp(ctx, type, def_reg, op2_reg, 0); if (ctx->regs[def][0] & IR_REG_SPILL_STORE) { @@ -4300,7 +4303,8 @@ 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_NONE && (op2_reg & IR_REG_SPILL_LOAD)) { op2_reg &= ~IR_REG_SPILL_LOAD; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } 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 @@ -4323,7 +4327,8 @@ static void ir_emit_store_fp(ir_ctx *ctx, ir_ref ref, ir_insn *insn) IR_ASSERT(op2_reg != IR_REG_NONE && op2_reg != IR_REG_NONE); if (op2_reg & IR_REG_SPILL_LOAD) { op2_reg &= ~IR_REG_SPILL_LOAD; - ir_emit_load(ctx, type, op2_reg, insn->op2); + IR_ASSERT(ctx->ir_base[insn->op2].type == IR_ADDR); + ir_emit_load(ctx, IR_ADDR, op2_reg, insn->op2); } if ((op3_reg & IR_REG_SPILL_LOAD) || IR_IS_CONST_REF(insn->op3)) { op3_reg &= ~IR_REG_SPILL_LOAD;