+fs_reg
+fs_reg_alloc::alloc_spill_reg(unsigned size, int ip)
+{
+ int vgrf = fs->alloc.allocate(size);
+ int n = ra_add_node(g, compiler->fs_reg_sets[rsi].classes[size - 1]);
+ assert(n == first_vgrf_node + vgrf);
+ assert(n == first_spill_node + spill_node_count);
+
+ setup_live_interference(n, ip - 1, ip + 1);
+
+ /* Add interference between this spill node and any other spill nodes for
+ * the same instruction.
+ */
+ for (int s = 0; s < spill_node_count; s++) {
+ if (spill_vgrf_ip[s] == ip)
+ ra_add_node_interference(g, n, first_spill_node + s);
+ }
+
+ /* Add this spill node to the list for next time */
+ if (spill_node_count >= spill_vgrf_ip_alloc) {
+ if (spill_vgrf_ip_alloc == 0)
+ spill_vgrf_ip_alloc = 16;
+ else
+ spill_vgrf_ip_alloc *= 2;
+ spill_vgrf_ip = reralloc(mem_ctx, spill_vgrf_ip, int,
+ spill_vgrf_ip_alloc);
+ }
+ spill_vgrf_ip[spill_node_count++] = ip;
+
+ return fs_reg(VGRF, vgrf);
+}
+