From 03bc645a01155b1e5e11e017c2816f533dedefb3 Mon Sep 17 00:00:00 2001 From: Sven Verdoolaege Date: Sat, 24 Aug 2013 14:09:49 +0200 Subject: [PATCH] add isl_val_inv Signed-off-by: Sven Verdoolaege --- doc/user.pod | 1 + include/isl/val.h | 1 + isl_test.c | 9 +++++++++ isl_val.c | 27 +++++++++++++++++++++++++++ 4 files changed, 38 insertions(+) diff --git a/doc/user.pod b/doc/user.pod index 1995bf28..8f50f46a 100644 --- a/doc/user.pod +++ b/doc/user.pod @@ -656,6 +656,7 @@ The following unary operations are available on Cs. __isl_give isl_val *isl_val_floor(__isl_take isl_val *v); __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v); __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v); + __isl_give isl_val *isl_val_inv(__isl_take isl_val *v); __isl_give isl_val *isl_val_2exp(__isl_take isl_val *v); The following binary operations are available on Cs. diff --git a/include/isl/val.h b/include/isl/val.h index 2a0dd92a..238f0c28 100644 --- a/include/isl/val.h +++ b/include/isl/val.h @@ -46,6 +46,7 @@ __isl_give isl_val *isl_val_set_si(__isl_take isl_val *v, long i); __isl_give isl_val *isl_val_abs(__isl_take isl_val *v); __isl_give isl_val *isl_val_neg(__isl_take isl_val *v); +__isl_give isl_val *isl_val_inv(__isl_take isl_val *v); __isl_give isl_val *isl_val_floor(__isl_take isl_val *v); __isl_give isl_val *isl_val_ceil(__isl_take isl_val *v); __isl_give isl_val *isl_val_trunc(__isl_take isl_val *v); diff --git a/isl_test.c b/isl_test.c index c4d5329a..cb9075ad 100644 --- a/isl_test.c +++ b/isl_test.c @@ -409,6 +409,15 @@ struct { { &isl_val_2exp, "1", "2" }, { &isl_val_2exp, "2", "4" }, { &isl_val_2exp, "3", "8" }, + { &isl_val_inv, "1", "1" }, + { &isl_val_inv, "2", "1/2" }, + { &isl_val_inv, "1/2", "2" }, + { &isl_val_inv, "-2", "-1/2" }, + { &isl_val_inv, "-1/2", "-2" }, + { &isl_val_inv, "0", "NaN" }, + { &isl_val_inv, "NaN", "NaN" }, + { &isl_val_inv, "infty", "0" }, + { &isl_val_inv, "-infty", "0" }, }; /* Perform some basic tests of unary operations on isl_val objects. diff --git a/isl_val.c b/isl_val.c index 00e7a0d0..4938c4c3 100644 --- a/isl_val.c +++ b/isl_val.c @@ -393,6 +393,33 @@ __isl_give isl_val *isl_val_neg(__isl_take isl_val *v) return v; } +/* Return the inverse of "v". + */ +__isl_give isl_val *isl_val_inv(__isl_take isl_val *v) +{ + if (!v) + return NULL; + if (isl_val_is_nan(v)) + return v; + if (isl_val_is_zero(v)) { + isl_ctx *ctx = isl_val_get_ctx(v); + isl_val_free(v); + return isl_val_nan(ctx); + } + if (isl_val_is_infty(v) || isl_val_is_neginfty(v)) { + isl_ctx *ctx = isl_val_get_ctx(v); + isl_val_free(v); + return isl_val_zero(ctx); + } + + v = isl_val_cow(v); + if (!v) + return NULL; + isl_int_swap(v->n, v->d); + + return isl_val_normalize(v); +} + /* Return the absolute value of "v". */ __isl_give isl_val *isl_val_abs(__isl_take isl_val *v) -- 2.11.4.GIT