+ have_spill_costs = true;
+}
+
+int
+fs_reg_alloc::choose_spill_reg()
+{
+ if (!have_spill_costs)
+ set_spill_costs();
+
+ int node = ra_get_best_spill_node(g);
+ if (node < 0)
+ return -1;
+
+ assert(node >= first_vgrf_node);
+ return node - first_vgrf_node;
+}
+
+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);