brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.1 KiB · dd49713 Raw
114 lines · c
1/*2 * Copyright 2011      Sven Verdoolaege3 * Copyright 2012-2013 Ecole Normale Superieure4 *5 * Use of this software is governed by the MIT license6 *7 * Written by Sven Verdoolaege,8 * Ecole Normale Superieure, 45 rue d'Ulm, 75230 Paris, France9 */10 11#include <isl/space.h>12#include <isl_val_private.h>13 14#include <isl_multi_macro.h>15 16/* Add "multi2" to "multi1" and return the result.17 */18__isl_give MULTI(BASE) *FN(MULTI(BASE),add)(__isl_take MULTI(BASE) *multi1,19	__isl_take MULTI(BASE) *multi2)20{21	return FN(MULTI(BASE),bin_op)(multi1, multi2, &FN(EL,add));22}23 24/* Subtract "multi2" from "multi1" and return the result.25 */26__isl_give MULTI(BASE) *FN(MULTI(BASE),sub)(__isl_take MULTI(BASE) *multi1,27	__isl_take MULTI(BASE) *multi2)28{29	return FN(MULTI(BASE),bin_op)(multi1, multi2, &FN(EL,sub));30}31 32/* Depending on "fn", multiply or divide the elements of "multi" by "v" and33 * return the result.34 */35static __isl_give MULTI(BASE) *FN(MULTI(BASE),scale_val_fn)(36	__isl_take MULTI(BASE) *multi, __isl_take isl_val *v,37	__isl_give EL *(*fn)(__isl_take EL *el, __isl_take isl_val *v))38{39	if (!multi || !v)40		goto error;41 42	if (isl_val_is_one(v)) {43		isl_val_free(v);44		return multi;45	}46 47	if (!isl_val_is_rat(v))48		isl_die(isl_val_get_ctx(v), isl_error_invalid,49			"expecting rational factor", goto error);50 51	return FN(MULTI(BASE),fn_val)(multi, fn, v);52error:53	isl_val_free(v);54	return FN(MULTI(BASE),free)(multi);55}56 57/* Multiply the elements of "multi" by "v" and return the result.58 */59__isl_give MULTI(BASE) *FN(MULTI(BASE),scale_val)(__isl_take MULTI(BASE) *multi,60	__isl_take isl_val *v)61{62	return FN(MULTI(BASE),scale_val_fn)(multi, v, &FN(EL,scale_val));63}64 65/* Divide the elements of "multi" by "v" and return the result.66 */67__isl_give MULTI(BASE) *FN(MULTI(BASE),scale_down_val)(68	__isl_take MULTI(BASE) *multi, __isl_take isl_val *v)69{70	if (!v)71		goto error;72	if (isl_val_is_zero(v))73		isl_die(isl_val_get_ctx(v), isl_error_invalid,74			"cannot scale down by zero", goto error);75	return FN(MULTI(BASE),scale_val_fn)(multi, v, &FN(EL,scale_down_val));76error:77	isl_val_free(v);78	return FN(MULTI(BASE),free)(multi);79}80 81/* Multiply the elements of "multi" by the corresponding element of "mv"82 * and return the result.83 */84__isl_give MULTI(BASE) *FN(MULTI(BASE),scale_multi_val)(85	__isl_take MULTI(BASE) *multi, __isl_take isl_multi_val *mv)86{87	return FN(MULTI(BASE),fn_multi_val)(multi, &FN(EL,scale_val), mv);88}89 90/* Divide the elements of "multi" by the corresponding element of "mv"91 * and return the result.92 */93__isl_give MULTI(BASE) *FN(MULTI(BASE),scale_down_multi_val)(94	__isl_take MULTI(BASE) *multi, __isl_take isl_multi_val *mv)95{96	return FN(MULTI(BASE),fn_multi_val)(multi, &FN(EL,scale_down_val), mv);97}98 99/* Compute the residues of the elements of "multi" modulo100 * the corresponding element of "mv" and return the result.101 */102__isl_give MULTI(BASE) *FN(MULTI(BASE),mod_multi_val)(103	__isl_take MULTI(BASE) *multi, __isl_take isl_multi_val *mv)104{105	return FN(MULTI(BASE),fn_multi_val)(multi, &FN(EL,mod_val), mv);106}107 108/* Return the opposite of "multi".109 */110__isl_give MULTI(BASE) *FN(MULTI(BASE),neg)(__isl_take MULTI(BASE) *multi)111{112	return FN(MULTI(BASE),un_op)(multi, &FN(EL,neg));113}114