2 * Copyright 2013 Ecole Normale Superieure
4 * Use of this software is governed by the MIT license
6 * Written by Sven Verdoolaege,
7 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France
10 #include <isl/space.h>
12 #include <isl_multi_macro.h>
14 /* Move the "n" dimensions of "src_type" starting at "src_pos" of "multi"
15 * to dimensions of "dst_type" at "dst_pos".
17 * We only support moving input dimensions to parameters and vice versa.
19 __isl_give
MULTI(BASE
) *FN(MULTI(BASE
),move_dims
)(__isl_take
MULTI(BASE
) *multi
,
20 enum isl_dim_type dst_type
, unsigned dst_pos
,
21 enum isl_dim_type src_type
, unsigned src_pos
, unsigned n
)
27 size
= FN(MULTI(BASE
),size
)(multi
);
29 return FN(MULTI(BASE
),free
)(multi
);
32 !isl_space_is_named_or_nested(multi
->space
, src_type
) &&
33 !isl_space_is_named_or_nested(multi
->space
, dst_type
))
36 if (dst_type
== isl_dim_out
|| src_type
== isl_dim_out
)
37 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
38 "cannot move output/set dimension",
39 return FN(MULTI(BASE
),free
)(multi
));
40 if (dst_type
== isl_dim_div
|| src_type
== isl_dim_div
)
41 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_invalid
,
43 return FN(MULTI(BASE
),free
)(multi
));
44 if (FN(MULTI(BASE
),check_range
)(multi
, src_type
, src_pos
, n
) < 0)
45 return FN(MULTI(BASE
),free
)(multi
);
46 if (dst_type
== src_type
)
47 isl_die(FN(MULTI(BASE
),get_ctx
)(multi
), isl_error_unsupported
,
48 "moving dims within the same type not supported",
49 return FN(MULTI(BASE
),free
)(multi
));
51 space
= FN(MULTI(BASE
),take_space
)(multi
);
52 space
= isl_space_move_dims(space
, dst_type
, dst_pos
,
53 src_type
, src_pos
, n
);
54 multi
= FN(MULTI(BASE
),restore_space
)(multi
, space
);
56 if (FN(MULTI(BASE
),has_explicit_domain
)(multi
))
57 multi
= FN(MULTI(BASE
),move_explicit_domain_dims
)(multi
,
58 dst_type
, dst_pos
, src_type
, src_pos
, n
);
60 for (i
= 0; i
< size
; ++i
) {
63 el
= FN(MULTI(BASE
),take_at
)(multi
, i
);
64 el
= FN(EL
,move_dims
)(el
, dst_type
, dst_pos
,
65 src_type
, src_pos
, n
);
66 multi
= FN(MULTI(BASE
),restore_at
)(multi
, i
, el
);