xref: /netbsd-src/external/mit/isl/dist/isl_multi_splice_templ.c (revision 5971e316fdea024efff6be8f03536623db06833e)
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