X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ir%2Fir%2Firarch.c;h=ada45d670d5b47f0eeb34d9d35636895152ae7e6;hb=672b5c243e900427b5dcae01441d4fa3327d692c;hp=04a3aeb2b178001302122c9822429dde55f6f211;hpb=1ce363f80e6a204d4011f85813362d9bd1d0e7e4;p=libfirm diff --git a/ir/ir/irarch.c b/ir/ir/irarch.c index 04a3aeb2b..ada45d670 100644 --- a/ir/ir/irarch.c +++ b/ir/ir/irarch.c @@ -930,16 +930,21 @@ ir_node *arch_dep_replace_div_by_const(ir_node *irn) { ir_node *k_node; ir_node *curr = left; - if (k != 1) { - k_node = new_r_Const_long(current_ir_graph, block, mode_Iu, k - 1); - curr = new_rd_Shrs(dbg, current_ir_graph, block, left, k_node, mode); + /* create the correction code for signed values only if there might be a remainder */ + if (! is_Div_remainderless(irn)) { + if (k != 1) { + k_node = new_r_Const_long(current_ir_graph, block, mode_Iu, k - 1); + curr = new_rd_Shrs(dbg, current_ir_graph, block, left, k_node, mode); + } + + k_node = new_r_Const_long(current_ir_graph, block, mode_Iu, bits - k); + curr = new_rd_Shr(dbg, current_ir_graph, block, curr, k_node, mode); + + curr = new_rd_Add(dbg, current_ir_graph, block, left, curr, mode); + } else { + k_node = left; } - k_node = new_r_Const_long(current_ir_graph, block, mode_Iu, bits - k); - curr = new_rd_Shr(dbg, current_ir_graph, block, curr, k_node, mode); - - curr = new_rd_Add(dbg, current_ir_graph, block, left, curr, mode); - k_node = new_r_Const_long(current_ir_graph, block, mode_Iu, k); res = new_rd_Shrs(dbg, current_ir_graph, block, curr, k_node, mode);