+ c.min = *indizes_left;
+ c.max = *indizes_right;
+
+ s = sn_stage_create (n->stages_num);
+ if (s == NULL)
+ return (-1);
+
+ sn_stage_comparator_add (s, &c);
+ sn_network_stage_add (n, s);
+
+ return (0);
+ }
+
+ /* Merge odd sequences */
+ tmp_left_num = (indizes_left_num + 1) / 2;
+ for (i = 0; i < tmp_left_num; i++)
+ tmp_left[i] = indizes_left[2 * i];
+
+ tmp_right_num = (indizes_right_num + 1) / 2;
+ for (i = 0; i < tmp_right_num; i++)
+ tmp_right[i] = indizes_right[2 * i];
+
+ sn_network_add_odd_even_merger (n,
+ tmp_left, tmp_left_num,
+ tmp_right, tmp_right_num);
+
+ /* Merge even sequences */
+ tmp_left_num = indizes_left_num / 2;
+ for (i = 0; i < tmp_left_num; i++)
+ tmp_left[i] = indizes_left[(2 * i) + 1];
+
+ tmp_right_num = indizes_right_num / 2;
+ for (i = 0; i < tmp_right_num; i++)
+ tmp_right[i] = indizes_right[(2 * i) + 1];
+
+ sn_network_add_odd_even_merger (n,
+ tmp_left, tmp_left_num,
+ tmp_right, tmp_right_num);
+
+ /* Apply ``comparison-interchange'' operations. */
+ s = sn_stage_create (n->stages_num);
+
+ max_index = indizes_left_num + indizes_right_num;
+ if ((max_index % 2) == 0)
+ max_index -= 3;
+ else
+ max_index -= 2;
+
+ for (i = 1; i <= max_index; i += 2)
+ {
+ sn_comparator_t c;
+
+ if (i < indizes_left_num)
+ c.min = indizes_left[i];
+ else
+ c.min = indizes_right[i - indizes_left_num];
+
+ if ((i + 1) < indizes_left_num)
+ c.max = indizes_left[i + 1];
+ else
+ c.max = indizes_right[i + 1 - indizes_left_num];
+
+ sn_stage_comparator_add (s, &c);
+ }
+
+ sn_network_stage_add (n, s);
+
+ return (0);
+} /* }}} int sn_network_add_odd_even_merger */
+
+static sn_network_t *sn_network_combine_bitonic_shift (sn_network_t *n0, /* {{{ */
+ sn_network_t *n1, int do_shift)
+{
+ sn_network_t *n;
+ sn_network_t *n1_clone;
+ int shift;
+
+ n1_clone = sn_network_clone (n1);
+ if (n1_clone == NULL)
+ return (NULL);
+
+ sn_network_invert (n1_clone);
+
+ n = sn_network_concatenate (n0, n1_clone);