mirror of
https://github.com/danog/ir.git
synced 2024-11-26 20:34:53 +01:00
Fix support for spill loads
This commit is contained in:
parent
1d01ce3a39
commit
4d7386d342
@ -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 {
|
||||
|
@ -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);
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user