xref: /netbsd-src/external/mit/isl/dist/isl_pw_scale_templ.c (revision 5971e316fdea024efff6be8f03536623db06833e)
1*5971e316Smrg /*
2*5971e316Smrg  * Copyright 2010      INRIA Saclay
3*5971e316Smrg  *
4*5971e316Smrg  * Use of this software is governed by the MIT license
5*5971e316Smrg  *
6*5971e316Smrg  * Written by Sven Verdoolaege, INRIA Saclay - Ile-de-France,
7*5971e316Smrg  * Parc Club Orsay Universite, ZAC des vignes, 4 rue Jacques Monod,
8*5971e316Smrg  * 91893 Orsay, France
9*5971e316Smrg  */
10*5971e316Smrg 
11*5971e316Smrg #include <isl_pw_macro.h>
12*5971e316Smrg 
FN(PW,scale)13*5971e316Smrg __isl_give PW *FN(PW,scale)(__isl_take PW *pw, isl_int v)
14*5971e316Smrg {
15*5971e316Smrg 	int i;
16*5971e316Smrg 	isl_size n;
17*5971e316Smrg 
18*5971e316Smrg 	if (isl_int_is_one(v))
19*5971e316Smrg 		return pw;
20*5971e316Smrg 	if (pw && DEFAULT_IS_ZERO && isl_int_is_zero(v)) {
21*5971e316Smrg 		PW *zero;
22*5971e316Smrg 		isl_space *space = FN(PW,get_space)(pw);
23*5971e316Smrg 		zero = FN(PW,ZERO)(space OPT_TYPE_ARG(pw->));
24*5971e316Smrg 		FN(PW,free)(pw);
25*5971e316Smrg 		return zero;
26*5971e316Smrg 	}
27*5971e316Smrg 	if (isl_int_is_neg(v))
28*5971e316Smrg 		pw = FN(PW,negate_type)(pw);
29*5971e316Smrg 
30*5971e316Smrg 	n = FN(PW,n_piece)(pw);
31*5971e316Smrg 	if (n < 0)
32*5971e316Smrg 		return FN(PW,free)(pw);
33*5971e316Smrg 	for (i = 0; i < n; ++i) {
34*5971e316Smrg 		EL *el;
35*5971e316Smrg 
36*5971e316Smrg 		el = FN(PW,take_base_at)(pw, i);
37*5971e316Smrg 		el = FN(EL,scale)(el, v);
38*5971e316Smrg 		pw = FN(PW,restore_base_at)(pw, i, el);
39*5971e316Smrg 	}
40*5971e316Smrg 
41*5971e316Smrg 	return pw;
42*5971e316Smrg }
43