Commit 0881224e by Tobias Burnus Committed by Tobias Burnus

intrinsic.c (add_functions): New internal intrinsic function GFC_PREFIX ("stride").

2013-01-04  Tobias Burnus  <burnus@net-b.de>

        * intrinsic.c (add_functions): New internal intrinsic
        function GFC_PREFIX ("stride").
        * gfortran.h (gfc_isym_id): Add GFC_ISYM_STRIDE.
        * intrinsic.h (gfc_resolve_stride): New prototypes.
        * iresolve.c (gfc_resolve_stride): New function.
        * trans-intrinsic.c (conv_intrinsic_stride): New static
        function.
        (gfc_conv_intrinsic_function): Use it.

From-SVN: r194918
parent 94241120
2013-01-04 Tobias Burnus <burnus@net-b.de> 2013-01-04 Tobias Burnus <burnus@net-b.de>
* intrinsic.c (add_functions): New internal intrinsic
function GFC_PREFIX ("stride").
* gfortran.h (gfc_isym_id): Add GFC_ISYM_STRIDE.
* intrinsic.h (gfc_resolve_stride): New prototypes.
* iresolve.c (gfc_resolve_stride): New function.
* trans-intrinsic.c (conv_intrinsic_stride): New static
function.
(gfc_conv_intrinsic_function): Use it.
2013-01-04 Tobias Burnus <burnus@net-b.de>
* class.c (gfc_find_intrinsic_vtab): Add _final * class.c (gfc_find_intrinsic_vtab): Add _final
component. component.
* decl.c (gfc_match_null): Remove superfluous
variadic argument to gfc_match.
2013-01-04 Paul Thomas <pault@gcc.gnu.org> 2013-01-04 Paul Thomas <pault@gcc.gnu.org>
......
...@@ -521,6 +521,7 @@ enum gfc_isym_id ...@@ -521,6 +521,7 @@ enum gfc_isym_id
GFC_ISYM_SR_KIND, GFC_ISYM_SR_KIND,
GFC_ISYM_STAT, GFC_ISYM_STAT,
GFC_ISYM_STORAGE_SIZE, GFC_ISYM_STORAGE_SIZE,
GFC_ISYM_STRIDE,
GFC_ISYM_SUM, GFC_ISYM_SUM,
GFC_ISYM_SYMLINK, GFC_ISYM_SYMLINK,
GFC_ISYM_SYMLNK, GFC_ISYM_SYMLNK,
......
...@@ -2640,6 +2640,14 @@ add_functions (void) ...@@ -2640,6 +2640,14 @@ add_functions (void)
make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95); make_generic ("size", GFC_ISYM_SIZE, GFC_STD_F95);
/* Obtain the stride for a given dimensions; to be used only internally.
"make_from_module" makes inaccessible for external users. */
add_sym_2 (GFC_PREFIX ("stride"), GFC_ISYM_STRIDE, CLASS_INQUIRY, ACTUAL_NO,
BT_INTEGER, gfc_index_integer_kind, GFC_STD_GNU,
NULL, NULL, gfc_resolve_stride,
ar, BT_REAL, dr, REQUIRED, dm, BT_INTEGER, ii, OPTIONAL);
make_from_module();
add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, ii, add_sym_1 ("sizeof", GFC_ISYM_SIZEOF, CLASS_IMPURE, ACTUAL_NO, BT_INTEGER, ii,
GFC_STD_GNU, gfc_check_sizeof, NULL, NULL, GFC_STD_GNU, gfc_check_sizeof, NULL, NULL,
x, BT_UNKNOWN, 0, REQUIRED); x, BT_UNKNOWN, 0, REQUIRED);
......
...@@ -546,6 +546,7 @@ void gfc_resolve_signal (gfc_expr *, gfc_expr *, gfc_expr *); ...@@ -546,6 +546,7 @@ void gfc_resolve_signal (gfc_expr *, gfc_expr *, gfc_expr *);
void gfc_resolve_sin (gfc_expr *, gfc_expr *); void gfc_resolve_sin (gfc_expr *, gfc_expr *);
void gfc_resolve_sinh (gfc_expr *, gfc_expr *); void gfc_resolve_sinh (gfc_expr *, gfc_expr *);
void gfc_resolve_size (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_size (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
void gfc_resolve_stride (gfc_expr *, gfc_expr *, gfc_expr *);
void gfc_resolve_spacing (gfc_expr *, gfc_expr *); void gfc_resolve_spacing (gfc_expr *, gfc_expr *);
void gfc_resolve_spread (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *); void gfc_resolve_spread (gfc_expr *, gfc_expr *, gfc_expr *, gfc_expr *);
void gfc_resolve_sqrt (gfc_expr *, gfc_expr *); void gfc_resolve_sqrt (gfc_expr *, gfc_expr *);
......
...@@ -2314,6 +2314,15 @@ gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED, ...@@ -2314,6 +2314,15 @@ gfc_resolve_size (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
void void
gfc_resolve_stride (gfc_expr *f, gfc_expr *array ATTRIBUTE_UNUSED,
gfc_expr *dim ATTRIBUTE_UNUSED)
{
f->ts.type = BT_INTEGER;
f->ts.kind = gfc_index_integer_kind;
}
void
gfc_resolve_spacing (gfc_expr *f, gfc_expr *x) gfc_resolve_spacing (gfc_expr *f, gfc_expr *x)
{ {
f->ts = x->ts; f->ts = x->ts;
......
...@@ -1657,6 +1657,35 @@ conv_intrinsic_cobound (gfc_se * se, gfc_expr * expr) ...@@ -1657,6 +1657,35 @@ conv_intrinsic_cobound (gfc_se * se, gfc_expr * expr)
static void static void
conv_intrinsic_stride (gfc_se * se, gfc_expr * expr)
{
gfc_actual_arglist *array_arg;
gfc_actual_arglist *dim_arg;
gfc_se argse;
tree desc, tmp;
array_arg = expr->value.function.actual;
dim_arg = array_arg->next;
gcc_assert (array_arg->expr->expr_type == EXPR_VARIABLE);
gfc_init_se (&argse, NULL);
gfc_conv_expr_descriptor (&argse, array_arg->expr);
gfc_add_block_to_block (&se->pre, &argse.pre);
gfc_add_block_to_block (&se->post, &argse.post);
desc = argse.expr;
gcc_assert (dim_arg->expr);
gfc_init_se (&argse, NULL);
gfc_conv_expr_type (&argse, dim_arg->expr, gfc_array_index_type);
gfc_add_block_to_block (&se->pre, &argse.pre);
tmp = fold_build2_loc (input_location, MINUS_EXPR, gfc_array_index_type,
argse.expr, gfc_index_one_node);
se->expr = gfc_conv_descriptor_stride_get (desc, tmp);
}
static void
gfc_conv_intrinsic_abs (gfc_se * se, gfc_expr * expr) gfc_conv_intrinsic_abs (gfc_se * se, gfc_expr * expr)
{ {
tree arg, cabs; tree arg, cabs;
...@@ -6806,6 +6835,10 @@ gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr) ...@@ -6806,6 +6835,10 @@ gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr)
gfc_conv_intrinsic_spacing (se, expr); gfc_conv_intrinsic_spacing (se, expr);
break; break;
case GFC_ISYM_STRIDE:
conv_intrinsic_stride (se, expr);
break;
case GFC_ISYM_SUM: case GFC_ISYM_SUM:
gfc_conv_intrinsic_arith (se, expr, PLUS_EXPR, false); gfc_conv_intrinsic_arith (se, expr, PLUS_EXPR, false);
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment