- ir_mode *mode = get_irn_mode(left);
- ir_node *quot;
-
- irn = new_Const(get_mode_one(mode));
- quot = new_rd_Quot(dbg, current_ir_graph, block, mem, irn, left, mode, op_pin_state_pinned);
- mem = new_r_Proj(current_ir_graph, block, quot, mode_M, pn_Quot_M);
- irn = new_r_Proj(current_ir_graph, block, quot, mode, pn_Quot_res);
- reg_jmp = new_r_Proj(current_ir_graph, block, quot, mode_X, pn_Quot_X_regular);
- exc_jmp = new_r_Proj(current_ir_graph, block, quot, mode_X, pn_Quot_X_except);
+ ir_mode *result_mode = get_irn_mode(left);
+ ir_node *div;
+
+ ir_mode *mode = result_mode;
+ ir_mode *float_arithmetic = be_get_backend_param()->mode_float_arithmetic;
+ if (float_arithmetic != NULL) {
+ left = new_r_Conv(block, left, float_arithmetic);
+ mode = float_arithmetic;
+ }
+
+ irn = new_r_Const(irg, get_mode_one(mode));
+ div = new_rd_Div(dbg, block, mem, irn, left, mode, op_pin_state_pinned);
+ mem = new_r_Proj(div, mode_M, pn_Div_M);
+ irn = new_r_Proj(div, mode, pn_Div_res);
+ if (ir_throws_exception(call)) {
+ reg_jmp = new_r_Proj(div, mode_X, pn_Div_X_regular);
+ exc_jmp = new_r_Proj(div, mode_X, pn_Div_X_except);
+ ir_set_throws_exception(div, true);
+ }
+ if (result_mode != mode) {
+ irn = new_r_Conv(block, irn, result_mode);
+ }