+ }
+
+#undef _ARG
+#define _ARG(_name,_modes,_var,_me) \
+arg->name = _name; \
+ arg->accepted_modes = RFLCT_MC(_modes); \
+ arg->is_variadic = _var; \
+ arg->mode_equals = _me;
+
+void rflct_new_opcode(opcode opc, const char *name, bool commutative)
+{
+ rflct_opcode_t *ropc = obstack_alloc(&obst, sizeof(*ropc));
+
+ ropc->opc = opc;
+ ropc->name = name;
+ ropc->sig_count = 0;
+ memset(ropc->sigs, 0, sizeof(ropc->sigs));
+
+ assure_opcode_capacity(opc);
+ opcodes[opc] = ropc;
+}
+
+bool rflct_opcode_add_signature(opcode opc, rflct_sig_t *sig)
+{
+ rflct_arg_t *args = sig->args;
+ rflct_opcode_t *op = opcodes[opc];
+ int i;
+
+ assert(op && "Illegal opcode");
+
+ for(i = 0; i < MAX_SIG_COUNT && op->sigs[i] != NULL; i++);
+
+ if(i >= MAX_SIG_COUNT)
+ return false;
+
+ op->sigs[op->sig_count++] = args;
+
+ free(sig);
+ return true;
+}
+
+
+rflct_sig_t *rflct_signature_allocate(int defs, int uses)
+{
+ rflct_sig_t *sig = xmalloc(sizeof(*sig));
+
+ rflct_arg_t *args =
+ obstack_alloc(&obst, sizeof(*args) * (defs + uses + 2));
+
+ rflct_arg_t *arg = args + defs;
+ MARK;
+
+ arg = args + defs + uses + 1;
+ FINISH;
+
+ sig->defs = defs;
+ sig->uses = uses;
+ sig->args = args;
+
+ return sig;