diff --git a/ir_aarch64.dasc b/ir_aarch64.dasc index 7dd2411..87f0061 100644 --- a/ir_aarch64.dasc +++ b/ir_aarch64.dasc @@ -2568,6 +2568,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) } if (IR_IS_TYPE_INT(src_type) && IR_IS_TYPE_INT(dst_type)) { if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (op1_reg != def_reg) { ir_emit_mov(ctx, dst_type, def_reg, op1_reg); } @@ -2576,6 +2580,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) } } else if (IR_IS_TYPE_FP(src_type) && IR_IS_TYPE_FP(dst_type)) { if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (op1_reg != def_reg) { ir_emit_fp_mov(ctx, dst_type, def_reg, op1_reg); } @@ -2585,6 +2593,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) } else if (IR_IS_TYPE_FP(src_type)) { IR_ASSERT(IR_IS_TYPE_INT(dst_type)); if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (src_type == IR_DOUBLE) { | fmov Rx(def_reg), Rd(op1_reg-IR_REG_FP_FIRST) } else { @@ -2607,6 +2619,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) } else if (IR_IS_TYPE_FP(dst_type)) { IR_ASSERT(IR_IS_TYPE_INT(src_type)); if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (dst_type == IR_DOUBLE) { | fmov Rd(def_reg-IR_REG_FP_FIRST), Rx(op1_reg) } else { diff --git a/ir_x86.dasc b/ir_x86.dasc index af3aad3..98464d4 100644 --- a/ir_x86.dasc +++ b/ir_x86.dasc @@ -4424,6 +4424,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) offset = ir_fuse_load(ctx, insn->op1, &op1_reg); ir_emit_load_mem_int(ctx, dst_type, def_reg, op1_reg, offset); } else if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (op1_reg != def_reg) { ir_emit_mov(ctx, dst_type, def_reg, op1_reg); } @@ -4436,6 +4440,10 @@ static void ir_emit_bitcast(ir_ctx *ctx, ir_ref def, ir_insn *insn) offset = ir_fuse_load(ctx, insn->op1, &op1_reg); ir_emit_load_mem_fp(ctx, dst_type, def_reg, op1_reg, offset); } else if (op1_reg != IR_REG_NONE) { + if (op1_reg & IR_REG_SPILL_LOAD) { + op1_reg &= ~IR_REG_SPILL_LOAD; + ir_emit_load(ctx, src_type, op1_reg, insn->op1); + } if (op1_reg != def_reg) { ir_emit_fp_mov(ctx, dst_type, def_reg, op1_reg); }