+/* Returns the number of all modes in the irp. */
+int (get_irp_n_modes)(void) {
+ return _get_irp_n_modes();
+}
+
+/* Returns the mode at position pos in the irp. */
+ir_mode *(get_irp_mode)(int pos) {
+ return _get_irp_mode(pos);
+}
+
+/* Adds mode to the list of modes in irp. */
+void add_irp_mode(ir_mode *mode) {
+ assert(mode != NULL);
+ assert(irp);
+ ARR_APP1(ir_mode *, irp->modes, mode);
+}
+
+/* Adds opcode to the list of opcodes in irp. */
+void add_irp_opcode(ir_op *opcode) {
+ int len;
+ size_t code;
+ assert(opcode != NULL);
+ assert(irp);
+ len = ARR_LEN(irp->opcodes);
+ code = opcode->code;
+ if ((int) code >= len) {
+ ARR_RESIZE(ir_op*, irp->opcodes, code+1);
+ memset(&irp->opcodes[len], 0, (code-len+1) * sizeof(irp->opcodes[0]));
+ }
+
+ assert(irp->opcodes[code] == NULL && "opcode registered twice");
+ irp->opcodes[code] = opcode;
+}
+
+/* Removes opcode from the list of opcodes and shrinks the list by one. */
+void remove_irp_opcode(ir_op *opcode) {
+ assert((int) opcode->code < ARR_LEN(irp->opcodes));
+ irp->opcodes[opcode->code] = NULL;
+}
+
+/* Returns the number of all opcodes in the irp. */
+int (get_irp_n_opcodes)(void) {
+ return _get_irp_n_opcodes();
+}
+
+/* Returns the opcode at position pos in the irp. */
+ir_op *(get_irp_opcode)(int pos) {
+ return _get_irp_opcode(pos);
+}
+
+/* Sets the generic function pointer of all opcodes to NULL */
+void clear_irp_opcodes_generic_func(void) {
+ int i;
+
+ for (i = get_irp_n_opcodes() - 1; i >= 0; --i) {
+ ir_op *op = get_irp_opcode(i);
+ op->ops.generic = (op_func)NULL;
+ }