mirror of
https://github.com/danog/ir.git
synced 2024-12-02 17:55:40 +01:00
Fixed code generation for imul
This commit is contained in:
parent
1fa3f2b6ae
commit
16b8e1cf4b
18
ir_x86.dasc
18
ir_x86.dasc
@ -3899,7 +3899,22 @@ static void ir_emit_mul_div_mod(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
ir_emit_load(ctx, type, op2_reg, op2);
|
ir_emit_load(ctx, type, op2_reg, op2);
|
||||||
}
|
}
|
||||||
if (insn->op == IR_MUL || insn->op == IR_MUL_OV) {
|
if (insn->op == IR_MUL || insn->op == IR_MUL_OV) {
|
||||||
IR_ASSERT(!IR_IS_TYPE_SIGNED(insn->type));
|
if (IR_IS_TYPE_SIGNED(insn->type)) {
|
||||||
|
if (op2_reg != IR_REG_NONE) {
|
||||||
|
if (IR_REG_SPILLED(op2_reg)) {
|
||||||
|
op2_reg = IR_REG_NUM(op2_reg);
|
||||||
|
ir_emit_load(ctx, type, op2_reg, op2);
|
||||||
|
}
|
||||||
|
| ASM_REG_OP imul, type, op2_reg
|
||||||
|
} else {
|
||||||
|
if (ir_rule(ctx, op2) & IR_FUSED) {
|
||||||
|
offset = ir_fuse_load(ctx, op2, &op2_reg);
|
||||||
|
} else {
|
||||||
|
offset = ir_ref_spill_slot(ctx, op2, &op2_reg);
|
||||||
|
}
|
||||||
|
| ASM_MEM_OP imul, type, [Ra(op2_reg)+offset]
|
||||||
|
}
|
||||||
|
} else {
|
||||||
if (op2_reg != IR_REG_NONE) {
|
if (op2_reg != IR_REG_NONE) {
|
||||||
if (IR_REG_SPILLED(op2_reg)) {
|
if (IR_REG_SPILLED(op2_reg)) {
|
||||||
op2_reg = IR_REG_NUM(op2_reg);
|
op2_reg = IR_REG_NUM(op2_reg);
|
||||||
@ -3914,6 +3929,7 @@ static void ir_emit_mul_div_mod(ir_ctx *ctx, ir_ref def, ir_insn *insn)
|
|||||||
}
|
}
|
||||||
| ASM_MEM_OP mul, type, [Ra(op2_reg)+offset]
|
| ASM_MEM_OP mul, type, [Ra(op2_reg)+offset]
|
||||||
}
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (IR_IS_TYPE_SIGNED(type)) {
|
if (IR_IS_TYPE_SIGNED(type)) {
|
||||||
if (ir_type_size[type] == 8) {
|
if (ir_type_size[type] == 8) {
|
||||||
|
Loading…
Reference in New Issue
Block a user