+ * Prepare the doubleword lowering algorithm. Creates an environment
+ * which can be used to register custom lowering functions
+ */
+void ir_prepare_dw_lowering(const lwrdw_param_t *param);
+
+/**
+ * Lower all doubleword operations in the program.
+ * Must be called after ir_prepare_dw_lowering()
+ */
+void ir_lower_dw_ops(void);
+
+typedef void (*lower_dw_func)(ir_node *node, ir_mode *mode);
+
+/**
+ * register a custom lowering function.
+ * After lowering the custom function should call ir_set_dw_lowered()
+ */
+void ir_register_dw_lower_function(ir_op *op, lower_dw_func func);
+
+/**
+ * After lowering a node a custom doubleword lowering function has to call this.
+ * It registers 2 new values for the high and low part of the lowered value.
+ */
+void ir_set_dw_lowered(ir_node *old, ir_node *new_low,
+ ir_node *new_high);
+
+/**
+ * Query lowering results of a node. In a lowering callback you can use this
+ * on all predecessors of a node. The only exception are block and phi nodes.
+ * Their predecessors are not necessarily transformed yet.
+ */
+lower64_entry_t *get_node_entry(ir_node *node);
+
+static inline ir_node *get_lowered_low(ir_node *node)
+{
+ return get_node_entry(node)->low_word;
+}
+
+static inline ir_node *get_lowered_high(ir_node *node)
+{
+ return get_node_entry(node)->high_word;
+}
+
+/**
+ * Return the unsigned variant of the lowered mode
+ * Note: you must only call this during a dw_lowering (= in a lowering callback)