1*5971e316Smrg /*
2*5971e316Smrg * Copyright 2012 Ecole Normale Superieure
3*5971e316Smrg *
4*5971e316Smrg * Use of this software is governed by the MIT license
5*5971e316Smrg *
6*5971e316Smrg * Written by Sven Verdoolaege,
7*5971e316Smrg * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
8*5971e316Smrg */
9*5971e316Smrg
10*5971e316Smrg #include <isl/ctx.h>
11*5971e316Smrg #include <isl/space.h>
12*5971e316Smrg
13*5971e316Smrg #include <isl_multi_macro.h>
14*5971e316Smrg
15*5971e316Smrg /* Given two multi expressions, "multi1"
16*5971e316Smrg *
17*5971e316Smrg * [A1 A2] -> [B1 B2]
18*5971e316Smrg *
19*5971e316Smrg * where A2 starts at position "in_pos" and B2 starts at position "out_pos",
20*5971e316Smrg * and "multi2"
21*5971e316Smrg *
22*5971e316Smrg * [C] -> [D]
23*5971e316Smrg *
24*5971e316Smrg * return the multi expression
25*5971e316Smrg *
26*5971e316Smrg * [A1 C A2] -> [B1 D B2]
27*5971e316Smrg *
28*5971e316Smrg * We first insert input dimensions to obtain
29*5971e316Smrg *
30*5971e316Smrg * [A1 C A2] -> [B1 B2]
31*5971e316Smrg *
32*5971e316Smrg * and
33*5971e316Smrg *
34*5971e316Smrg * [A1 C A2] -> [D]
35*5971e316Smrg *
36*5971e316Smrg * and then apply range_splice.
37*5971e316Smrg */
MULTI(BASE)38*5971e316Smrg __isl_give MULTI(BASE) *FN(MULTI(BASE),splice)(
39*5971e316Smrg __isl_take MULTI(BASE) *multi1, unsigned in_pos, unsigned out_pos,
40*5971e316Smrg __isl_take MULTI(BASE) *multi2)
41*5971e316Smrg {
42*5971e316Smrg isl_size n_in1;
43*5971e316Smrg isl_size n_in2;
44*5971e316Smrg
45*5971e316Smrg n_in1 = FN(MULTI(BASE),dim)(multi1, isl_dim_in);
46*5971e316Smrg n_in2 = FN(MULTI(BASE),dim)(multi2, isl_dim_in);
47*5971e316Smrg if (n_in1 < 0 || n_in2 < 0)
48*5971e316Smrg goto error;
49*5971e316Smrg
50*5971e316Smrg if (FN(MULTI(BASE),check_range)(multi1, isl_dim_in, in_pos, 0) < 0)
51*5971e316Smrg goto error;
52*5971e316Smrg
53*5971e316Smrg multi1 = FN(MULTI(BASE),insert_dims)(multi1, isl_dim_in, in_pos, n_in2);
54*5971e316Smrg multi2 = FN(MULTI(BASE),insert_dims)(multi2, isl_dim_in, n_in2,
55*5971e316Smrg n_in1 - in_pos);
56*5971e316Smrg multi2 = FN(MULTI(BASE),insert_dims)(multi2, isl_dim_in, 0, in_pos);
57*5971e316Smrg
58*5971e316Smrg return FN(MULTI(BASE),range_splice)(multi1, out_pos, multi2);
59*5971e316Smrg error:
60*5971e316Smrg FN(MULTI(BASE),free)(multi1);
61*5971e316Smrg FN(MULTI(BASE),free)(multi2);
62*5971e316Smrg return NULL;
63*5971e316Smrg }
64