#include "pdeq.h"
#include "irdump.h"
#include "array_t.h"
+#include "irpass_t.h"
/** A map from mode to a primitive type. */
static pmap *prim_types;
if (mode == lenv->params->high_signed ||
mode == lenv->params->high_unsigned) {
/* ok, found a node that will be lowered */
- link = obstack_alloc(&lenv->obst, sizeof(*link));
-
- memset(link, 0, sizeof(*link));
+ link = OALLOCZ(&lenv->obst, node_entry_t);
idx = get_irn_idx(node);
if (idx >= lenv->n_entries) {
* @param op the emulated ir_op
* @param imode the input mode of the emulated opcode
* @param omode the output mode of the emulated opcode
- * @param block where the new mode is created
* @param env the lower environment
*/
static ir_node *get_intrinsic_address(ir_type *method, ir_op *op,
ir_mode *imode, ir_mode *omode,
- ir_node *block, lower_env_t *env) {
+ lower_env_t *env) {
symconst_symbol sym;
ir_entity *ent;
op_mode_entry_t key, *entry;
mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
opmode = get_irn_op_mode(node);
- irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, env);
call = new_rd_Call(dbg, block, get_Div_mem(node), irn, 4, in, mtp);
set_irn_pinned(call, get_irn_pinned(node));
irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
case pn_Div_M: /* Memory result. */
/* reroute to the call */
set_Proj_pred(proj, call);
- set_Proj_proj(proj, pn_Call_M_except);
+ set_Proj_proj(proj, pn_Call_M);
break;
case pn_Div_X_except: /* Execution result if exception occurred. */
/* reroute to the call */
mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
opmode = get_irn_op_mode(node);
- irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), opmode, opmode, env);
call = new_rd_Call(dbg, block, get_Mod_mem(node), irn, 4, in, mtp);
set_irn_pinned(call, get_irn_pinned(node));
irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
case pn_Mod_M: /* Memory result. */
/* reroute to the call */
set_Proj_pred(proj, call);
- set_Proj_proj(proj, pn_Call_M_except);
+ set_Proj_proj(proj, pn_Call_M);
break;
case pn_Mod_X_except: /* Execution result if exception occurred. */
/* reroute to the call */
mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
if (flags & 1) {
opmode = get_irn_op_mode(node);
- irn = get_intrinsic_address(mtp, op_Div, opmode, opmode, block, env);
+ irn = get_intrinsic_address(mtp, op_Div, opmode, opmode, env);
callDiv = new_rd_Call(dbg, block, mem, irn, 4, in, mtp);
set_irn_pinned(callDiv, get_irn_pinned(node));
resDiv = new_r_Proj(block, callDiv, mode_T, pn_Call_T_result);
if (flags & 1)
mem = new_r_Proj(block, callDiv, mode_M, pn_Call_M);
opmode = get_irn_op_mode(node);
- irn = get_intrinsic_address(mtp, op_Mod, opmode, opmode, block, env);
+ irn = get_intrinsic_address(mtp, op_Mod, opmode, opmode, env);
callMod = new_rd_Call(dbg, block, mem, irn, 4, in, mtp);
set_irn_pinned(callMod, get_irn_pinned(node));
resMod = new_r_Proj(block, callMod, mode_T, pn_Call_T_result);
case pn_DivMod_M: /* Memory result. */
/* reroute to the first call */
set_Proj_pred(proj, callDiv ? callDiv : (callMod ? callMod : mem));
- set_Proj_proj(proj, pn_Call_M_except);
+ set_Proj_proj(proj, pn_Call_M);
break;
case pn_DivMod_X_except: /* Execution result if exception occurred. */
/* reroute to the first call */
irg = current_ir_graph;
mtp = mode_is_signed(mode) ? binop_tp_s : binop_tp_u;
- irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
irn, 4, in, mtp);
set_irn_pinned(irn, get_irn_pinned(node));
irg = current_ir_graph;
mtp = mode_is_signed(mode) ? shiftop_tp_s : shiftop_tp_u;
- irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
irn, 3, in, mtp);
set_irn_pinned(irn, get_irn_pinned(node));
block = get_nodes_block(node);
mtp = mode_is_signed(mode) ? unop_tp_s : unop_tp_u;
- irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), mode, mode, env);
irn = new_rd_Call(dbg, block, get_irg_no_mem(current_ir_graph),
irn, 2, in, mtp);
set_irn_pinned(irn, get_irn_pinned(node));
ir_mode *omode = env->params->high_signed;
ir_type *mtp = get_conv_type(imode, omode, env);
- irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
call = new_rd_Call(dbg, block, get_irg_no_mem(irg), irn, 1, &op, mtp);
set_irn_pinned(call, get_irn_pinned(node));
irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
ir_type *mtp = get_conv_type(imode, omode, env);
/* do an intrinsic call */
- irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
call = new_rd_Call(dbg, block, get_irg_no_mem(irg), irn, 1, &op, mtp);
set_irn_pinned(call, get_irn_pinned(node));
irn = new_r_Proj(block, call, mode_T, pn_Call_T_result);
ir_mode *imode = env->params->high_signed;
ir_type *mtp = get_conv_type(imode, omode, env);
- irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
in[0] = env->entries[idx]->low_word;
in[1] = env->entries[idx]->high_word;
ir_mode *imode = env->params->high_unsigned;
ir_type *mtp = get_conv_type(imode, omode, env);
- irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, block, env);
+ irn = get_intrinsic_address(mtp, get_irn_op(node), imode, omode, env);
in[0] = env->entries[idx]->low_word;
in[1] = env->entries[idx]->high_word;
* Translate a Call.
*/
static void lower_Call(ir_node *node, ir_mode *mode, lower_env_t *env) {
- ir_graph *irg = current_ir_graph;
ir_type *tp = get_Call_type(node);
ir_type *call_tp;
ir_node **in, *proj, *results;
current_ir_graph = rem;
} /* lower_dw_ops */
+struct pass_t {
+ ir_prog_pass_t pass;
+ const lwrdw_param_t *param;
+};
+
+/**
+ * Creates a wrapper around lower_dw_ops().
+ */
+static int pass_wrapper(ir_prog *irp, void *context)
+{
+ struct pass_t *pass = context;
+
+ (void)irp;
+ lower_dw_ops(pass->param);
+ return 0;
+}
+
+ir_prog_pass_t *lower_dw_ops_pass(const char *name, const lwrdw_param_t *param) {
+ struct pass_t *pass = XMALLOCZ(struct pass_t);
+
+ pass->param = param;
+ return def_prog_pass_constructor(
+ &pass->pass, name ? name : "lower_dw", pass_wrapper);
+} /* lower_dw_ops_pass */
+
/* Default implementation. */
ir_entity *def_create_intrinsic_fkt(ir_type *method, const ir_op *op,
const ir_mode *imode, const ir_mode *omode,