1 /* Intrinsic translation
2 Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007
3 Free Software Foundation, Inc.
4 Contributed by Paul Brook <paul@nowt.org>
5 and Steven Bosscher <s.bosscher@student.tudelft.nl>
7 This file is part of GCC.
9 GCC is free software; you can redistribute it and/or modify it under
10 the terms of the GNU General Public License as published by the Free
11 Software Foundation; either version 3, or (at your option) any later
14 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
15 WARRANTY; without even the implied warranty of MERCHANTABILITY or
16 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
19 You should have received a copy of the GNU General Public License
20 along with GCC; see the file COPYING3. If not see
21 <http://www.gnu.org/licenses/>. */
23 /* trans-intrinsic.c-- generate GENERIC trees for calls to intrinsics. */
27 #include "coretypes.h"
33 #include "tree-gimple.h"
37 #include "intrinsic.h"
39 #include "trans-const.h"
40 #include "trans-types.h"
41 #include "trans-array.h"
43 /* Only for gfc_trans_assign and gfc_trans_pointer_assign. */
44 #include "trans-stmt.h"
46 /* This maps fortran intrinsic math functions to external library or GCC
48 typedef struct gfc_intrinsic_map_t GTY(())
50 /* The explicit enum is required to work around inadequacies in the
51 garbage collection/gengtype parsing mechanism. */
54 /* Enum value from the "language-independent", aka C-centric, part
55 of gcc, or END_BUILTINS of no such value set. */
56 enum built_in_function code_r4;
57 enum built_in_function code_r8;
58 enum built_in_function code_r10;
59 enum built_in_function code_r16;
60 enum built_in_function code_c4;
61 enum built_in_function code_c8;
62 enum built_in_function code_c10;
63 enum built_in_function code_c16;
65 /* True if the naming pattern is to prepend "c" for complex and
66 append "f" for kind=4. False if the naming pattern is to
67 prepend "_gfortran_" and append "[rc](4|8|10|16)". */
70 /* True if a complex version of the function exists. */
71 bool complex_available;
73 /* True if the function should be marked const. */
76 /* The base library name of this function. */
79 /* Cache decls created for the various operand types. */
91 /* ??? The NARGS==1 hack here is based on the fact that (c99 at least)
92 defines complex variants of all of the entries in mathbuiltins.def
94 #define DEFINE_MATH_BUILTIN(ID, NAME, ARGTYPE) \
95 { GFC_ISYM_ ## ID, BUILT_IN_ ## ID ## F, BUILT_IN_ ## ID, \
96 BUILT_IN_ ## ID ## L, BUILT_IN_ ## ID ## L, 0, 0, 0, 0, true, \
97 false, true, NAME, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, \
98 NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE},
100 #define DEFINE_MATH_BUILTIN_C(ID, NAME, ARGTYPE) \
101 { GFC_ISYM_ ## ID, BUILT_IN_ ## ID ## F, BUILT_IN_ ## ID, \
102 BUILT_IN_ ## ID ## L, BUILT_IN_ ## ID ## L, BUILT_IN_C ## ID ## F, \
103 BUILT_IN_C ## ID, BUILT_IN_C ## ID ## L, BUILT_IN_C ## ID ## L, true, \
104 true, true, NAME, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, \
105 NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE},
107 #define LIBM_FUNCTION(ID, NAME, HAVE_COMPLEX) \
108 { GFC_ISYM_ ## ID, END_BUILTINS, END_BUILTINS, END_BUILTINS, END_BUILTINS, \
109 END_BUILTINS, END_BUILTINS, END_BUILTINS, END_BUILTINS, \
110 true, HAVE_COMPLEX, true, NAME, NULL_TREE, NULL_TREE, NULL_TREE, \
111 NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE }
113 #define LIBF_FUNCTION(ID, NAME, HAVE_COMPLEX) \
114 { GFC_ISYM_ ## ID, END_BUILTINS, END_BUILTINS, END_BUILTINS, END_BUILTINS, \
115 END_BUILTINS, END_BUILTINS, END_BUILTINS, END_BUILTINS, \
116 false, HAVE_COMPLEX, true, NAME, NULL_TREE, NULL_TREE, NULL_TREE, \
117 NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE, NULL_TREE }
119 static GTY(()) gfc_intrinsic_map_t gfc_intrinsic_map[] =
121 /* Functions built into gcc itself. */
122 #include "mathbuiltins.def"
124 /* Functions in libm. */
125 /* ??? This does exist as BUILT_IN_SCALBN, but doesn't quite fit the
126 pattern for other mathbuiltins.def entries. At present we have no
127 optimizations for this in the common sources. */
128 LIBM_FUNCTION (SCALE, "scalbn", false),
130 /* Functions in libgfortran. */
131 LIBF_FUNCTION (FRACTION, "fraction", false),
132 LIBF_FUNCTION (NEAREST, "nearest", false),
133 LIBF_FUNCTION (RRSPACING, "rrspacing", false),
134 LIBF_FUNCTION (SET_EXPONENT, "set_exponent", false),
135 LIBF_FUNCTION (SPACING, "spacing", false),
138 LIBF_FUNCTION (NONE, NULL, false)
140 #undef DEFINE_MATH_BUILTIN
141 #undef DEFINE_MATH_BUILTIN_C
145 /* Structure for storing components of a floating number to be used by
146 elemental functions to manipulate reals. */
149 tree arg; /* Variable tree to view convert to integer. */
150 tree expn; /* Variable tree to save exponent. */
151 tree frac; /* Variable tree to save fraction. */
152 tree smask; /* Constant tree of sign's mask. */
153 tree emask; /* Constant tree of exponent's mask. */
154 tree fmask; /* Constant tree of fraction's mask. */
155 tree edigits; /* Constant tree of the number of exponent bits. */
156 tree fdigits; /* Constant tree of the number of fraction bits. */
157 tree f1; /* Constant tree of the f1 defined in the real model. */
158 tree bias; /* Constant tree of the bias of exponent in the memory. */
159 tree type; /* Type tree of arg1. */
160 tree mtype; /* Type tree of integer type. Kind is that of arg1. */
164 enum rounding_mode { RND_ROUND, RND_TRUNC, RND_CEIL, RND_FLOOR };
166 /* Evaluate the arguments to an intrinsic function. The value
167 of NARGS may be less than the actual number of arguments in EXPR
168 to allow optional "KIND" arguments that are not included in the
169 generated code to be ignored. */
172 gfc_conv_intrinsic_function_args (gfc_se *se, gfc_expr *expr,
173 tree *argarray, int nargs)
175 gfc_actual_arglist *actual;
177 gfc_intrinsic_arg *formal;
181 formal = expr->value.function.isym->formal;
182 actual = expr->value.function.actual;
184 for (curr_arg = 0; curr_arg < nargs; curr_arg++,
185 actual = actual->next,
186 formal = formal ? formal->next : NULL)
190 /* Skip omitted optional arguments. */
197 /* Evaluate the parameter. This will substitute scalarized
198 references automatically. */
199 gfc_init_se (&argse, se);
201 if (e->ts.type == BT_CHARACTER)
203 gfc_conv_expr (&argse, e);
204 gfc_conv_string_parameter (&argse);
205 argarray[curr_arg++] = argse.string_length;
206 gcc_assert (curr_arg < nargs);
209 gfc_conv_expr_val (&argse, e);
211 /* If an optional argument is itself an optional dummy argument,
212 check its presence and substitute a null if absent. */
213 if (e->expr_type ==EXPR_VARIABLE
214 && e->symtree->n.sym->attr.optional
217 gfc_conv_missing_dummy (&argse, e, formal->ts);
219 gfc_add_block_to_block (&se->pre, &argse.pre);
220 gfc_add_block_to_block (&se->post, &argse.post);
221 argarray[curr_arg] = argse.expr;
225 /* Count the number of actual arguments to the intrinsic function EXPR
226 including any "hidden" string length arguments. */
229 gfc_intrinsic_argument_list_length (gfc_expr *expr)
232 gfc_actual_arglist *actual;
234 for (actual = expr->value.function.actual; actual; actual = actual->next)
239 if (actual->expr->ts.type == BT_CHARACTER)
249 /* Conversions between different types are output by the frontend as
250 intrinsic functions. We implement these directly with inline code. */
253 gfc_conv_intrinsic_conversion (gfc_se * se, gfc_expr * expr)
259 nargs = gfc_intrinsic_argument_list_length (expr);
260 args = alloca (sizeof (tree) * nargs);
262 /* Evaluate all the arguments passed. Whilst we're only interested in the
263 first one here, there are other parts of the front-end that assume this
264 and will trigger an ICE if it's not the case. */
265 type = gfc_typenode_for_spec (&expr->ts);
266 gcc_assert (expr->value.function.actual->expr);
267 gfc_conv_intrinsic_function_args (se, expr, args, nargs);
269 /* Conversion from complex to non-complex involves taking the real
270 component of the value. */
271 if (TREE_CODE (TREE_TYPE (args[0])) == COMPLEX_TYPE
272 && expr->ts.type != BT_COMPLEX)
276 artype = TREE_TYPE (TREE_TYPE (args[0]));
277 args[0] = build1 (REALPART_EXPR, artype, args[0]);
280 se->expr = convert (type, args[0]);
283 /* This is needed because the gcc backend only implements
284 FIX_TRUNC_EXPR, which is the same as INT() in Fortran.
285 FLOOR(x) = INT(x) <= x ? INT(x) : INT(x) - 1
286 Similarly for CEILING. */
289 build_fixbound_expr (stmtblock_t * pblock, tree arg, tree type, int up)
296 argtype = TREE_TYPE (arg);
297 arg = gfc_evaluate_now (arg, pblock);
299 intval = convert (type, arg);
300 intval = gfc_evaluate_now (intval, pblock);
302 tmp = convert (argtype, intval);
303 cond = build2 (up ? GE_EXPR : LE_EXPR, boolean_type_node, tmp, arg);
305 tmp = build2 (up ? PLUS_EXPR : MINUS_EXPR, type, intval,
306 build_int_cst (type, 1));
307 tmp = build3 (COND_EXPR, type, cond, intval, tmp);
312 /* Round to nearest integer, away from zero. */
315 build_round_expr (tree arg, tree restype)
320 bool longlong, convert;
321 int argprec, resprec;
323 argtype = TREE_TYPE (arg);
324 argprec = TYPE_PRECISION (argtype);
325 resprec = TYPE_PRECISION (restype);
327 /* Depending on the type of the result, choose the long int intrinsic
328 (lround family) or long long intrinsic (llround). We might also
329 need to convert the result afterwards. */
330 if (resprec <= LONG_TYPE_SIZE)
333 if (resprec != LONG_TYPE_SIZE)
338 else if (resprec <= LONG_LONG_TYPE_SIZE)
341 if (resprec != LONG_LONG_TYPE_SIZE)
349 /* Now, depending on the argument type, we choose between intrinsics. */
350 if (argprec == TYPE_PRECISION (float_type_node))
351 fn = built_in_decls[longlong ? BUILT_IN_LLROUNDF : BUILT_IN_LROUNDF];
352 else if (argprec == TYPE_PRECISION (double_type_node))
353 fn = built_in_decls[longlong ? BUILT_IN_LLROUND : BUILT_IN_LROUND];
354 else if (argprec == TYPE_PRECISION (long_double_type_node))
355 fn = built_in_decls[longlong ? BUILT_IN_LLROUNDL : BUILT_IN_LROUNDL];
359 tmp = build_call_expr (fn, 1, arg);
361 tmp = fold_convert (restype, tmp);
366 /* Convert a real to an integer using a specific rounding mode.
367 Ideally we would just build the corresponding GENERIC node,
368 however the RTL expander only actually supports FIX_TRUNC_EXPR. */
371 build_fix_expr (stmtblock_t * pblock, tree arg, tree type,
372 enum rounding_mode op)
377 return build_fixbound_expr (pblock, arg, type, 0);
381 return build_fixbound_expr (pblock, arg, type, 1);
385 return build_round_expr (arg, type);
389 return build1 (FIX_TRUNC_EXPR, type, arg);
398 /* Round a real value using the specified rounding mode.
399 We use a temporary integer of that same kind size as the result.
400 Values larger than those that can be represented by this kind are
401 unchanged, as they will not be accurate enough to represent the
403 huge = HUGE (KIND (a))
404 aint (a) = ((a > huge) || (a < -huge)) ? a : (real)(int)a
408 gfc_conv_intrinsic_aint (gfc_se * se, gfc_expr * expr, enum rounding_mode op)
419 kind = expr->ts.kind;
422 /* We have builtin functions for some cases. */
465 /* Evaluate the argument. */
466 gcc_assert (expr->value.function.actual->expr);
467 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
469 /* Use a builtin function if one exists. */
470 if (n != END_BUILTINS)
472 tmp = built_in_decls[n];
473 se->expr = build_call_expr (tmp, 1, arg);
477 /* This code is probably redundant, but we'll keep it lying around just
479 type = gfc_typenode_for_spec (&expr->ts);
480 arg = gfc_evaluate_now (arg, &se->pre);
482 /* Test if the value is too large to handle sensibly. */
483 gfc_set_model_kind (kind);
485 n = gfc_validate_kind (BT_INTEGER, kind, false);
486 mpfr_set_z (huge, gfc_integer_kinds[n].huge, GFC_RND_MODE);
487 tmp = gfc_conv_mpfr_to_tree (huge, kind);
488 cond = build2 (LT_EXPR, boolean_type_node, arg, tmp);
490 mpfr_neg (huge, huge, GFC_RND_MODE);
491 tmp = gfc_conv_mpfr_to_tree (huge, kind);
492 tmp = build2 (GT_EXPR, boolean_type_node, arg, tmp);
493 cond = build2 (TRUTH_AND_EXPR, boolean_type_node, cond, tmp);
494 itype = gfc_get_int_type (kind);
496 tmp = build_fix_expr (&se->pre, arg, itype, op);
497 tmp = convert (type, tmp);
498 se->expr = build3 (COND_EXPR, type, cond, tmp, arg);
503 /* Convert to an integer using the specified rounding mode. */
506 gfc_conv_intrinsic_int (gfc_se * se, gfc_expr * expr, enum rounding_mode op)
512 nargs = gfc_intrinsic_argument_list_length (expr);
513 args = alloca (sizeof (tree) * nargs);
515 /* Evaluate the argument, we process all arguments even though we only
516 use the first one for code generation purposes. */
517 type = gfc_typenode_for_spec (&expr->ts);
518 gcc_assert (expr->value.function.actual->expr);
519 gfc_conv_intrinsic_function_args (se, expr, args, nargs);
521 if (TREE_CODE (TREE_TYPE (args[0])) == INTEGER_TYPE)
523 /* Conversion to a different integer kind. */
524 se->expr = convert (type, args[0]);
528 /* Conversion from complex to non-complex involves taking the real
529 component of the value. */
530 if (TREE_CODE (TREE_TYPE (args[0])) == COMPLEX_TYPE
531 && expr->ts.type != BT_COMPLEX)
535 artype = TREE_TYPE (TREE_TYPE (args[0]));
536 args[0] = build1 (REALPART_EXPR, artype, args[0]);
539 se->expr = build_fix_expr (&se->pre, args[0], type, op);
544 /* Get the imaginary component of a value. */
547 gfc_conv_intrinsic_imagpart (gfc_se * se, gfc_expr * expr)
551 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
552 se->expr = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (arg)), arg);
556 /* Get the complex conjugate of a value. */
559 gfc_conv_intrinsic_conjg (gfc_se * se, gfc_expr * expr)
563 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
564 se->expr = build1 (CONJ_EXPR, TREE_TYPE (arg), arg);
568 /* Initialize function decls for library functions. The external functions
569 are created as required. Builtin functions are added here. */
572 gfc_build_intrinsic_lib_fndecls (void)
574 gfc_intrinsic_map_t *m;
576 /* Add GCC builtin functions. */
577 for (m = gfc_intrinsic_map; m->id != GFC_ISYM_NONE; m++)
579 if (m->code_r4 != END_BUILTINS)
580 m->real4_decl = built_in_decls[m->code_r4];
581 if (m->code_r8 != END_BUILTINS)
582 m->real8_decl = built_in_decls[m->code_r8];
583 if (m->code_r10 != END_BUILTINS)
584 m->real10_decl = built_in_decls[m->code_r10];
585 if (m->code_r16 != END_BUILTINS)
586 m->real16_decl = built_in_decls[m->code_r16];
587 if (m->code_c4 != END_BUILTINS)
588 m->complex4_decl = built_in_decls[m->code_c4];
589 if (m->code_c8 != END_BUILTINS)
590 m->complex8_decl = built_in_decls[m->code_c8];
591 if (m->code_c10 != END_BUILTINS)
592 m->complex10_decl = built_in_decls[m->code_c10];
593 if (m->code_c16 != END_BUILTINS)
594 m->complex16_decl = built_in_decls[m->code_c16];
599 /* Create a fndecl for a simple intrinsic library function. */
602 gfc_get_intrinsic_lib_fndecl (gfc_intrinsic_map_t * m, gfc_expr * expr)
607 gfc_actual_arglist *actual;
610 char name[GFC_MAX_SYMBOL_LEN + 3];
613 if (ts->type == BT_REAL)
618 pdecl = &m->real4_decl;
621 pdecl = &m->real8_decl;
624 pdecl = &m->real10_decl;
627 pdecl = &m->real16_decl;
633 else if (ts->type == BT_COMPLEX)
635 gcc_assert (m->complex_available);
640 pdecl = &m->complex4_decl;
643 pdecl = &m->complex8_decl;
646 pdecl = &m->complex10_decl;
649 pdecl = &m->complex16_decl;
664 snprintf (name, sizeof (name), "%s%s%s",
665 ts->type == BT_COMPLEX ? "c" : "", m->name, "f");
666 else if (ts->kind == 8)
667 snprintf (name, sizeof (name), "%s%s",
668 ts->type == BT_COMPLEX ? "c" : "", m->name);
671 gcc_assert (ts->kind == 10 || ts->kind == 16);
672 snprintf (name, sizeof (name), "%s%s%s",
673 ts->type == BT_COMPLEX ? "c" : "", m->name, "l");
678 snprintf (name, sizeof (name), PREFIX ("%s_%c%d"), m->name,
679 ts->type == BT_COMPLEX ? 'c' : 'r',
683 argtypes = NULL_TREE;
684 for (actual = expr->value.function.actual; actual; actual = actual->next)
686 type = gfc_typenode_for_spec (&actual->expr->ts);
687 argtypes = gfc_chainon_list (argtypes, type);
689 argtypes = gfc_chainon_list (argtypes, void_type_node);
690 type = build_function_type (gfc_typenode_for_spec (ts), argtypes);
691 fndecl = build_decl (FUNCTION_DECL, get_identifier (name), type);
693 /* Mark the decl as external. */
694 DECL_EXTERNAL (fndecl) = 1;
695 TREE_PUBLIC (fndecl) = 1;
697 /* Mark it __attribute__((const)), if possible. */
698 TREE_READONLY (fndecl) = m->is_constant;
700 rest_of_decl_compilation (fndecl, 1, 0);
707 /* Convert an intrinsic function into an external or builtin call. */
710 gfc_conv_intrinsic_lib_function (gfc_se * se, gfc_expr * expr)
712 gfc_intrinsic_map_t *m;
716 unsigned int num_args;
719 id = expr->value.function.isym->id;
720 /* Find the entry for this function. */
721 for (m = gfc_intrinsic_map; m->id != GFC_ISYM_NONE; m++)
727 if (m->id == GFC_ISYM_NONE)
729 internal_error ("Intrinsic function %s(%d) not recognized",
730 expr->value.function.name, id);
733 /* Get the decl and generate the call. */
734 num_args = gfc_intrinsic_argument_list_length (expr);
735 args = alloca (sizeof (tree) * num_args);
737 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
738 fndecl = gfc_get_intrinsic_lib_fndecl (m, expr);
739 rettype = TREE_TYPE (TREE_TYPE (fndecl));
741 fndecl = build_addr (fndecl, current_function_decl);
742 se->expr = build_call_array (rettype, fndecl, num_args, args);
745 /* Generate code for EXPONENT(X) intrinsic function. */
748 gfc_conv_intrinsic_exponent (gfc_se *se, gfc_expr *expr)
750 tree arg, fndecl, type;
753 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
755 a1 = expr->value.function.actual->expr;
759 fndecl = gfor_fndecl_math_exponent4;
762 fndecl = gfor_fndecl_math_exponent8;
765 fndecl = gfor_fndecl_math_exponent10;
768 fndecl = gfor_fndecl_math_exponent16;
774 /* Convert it to the required type. */
775 type = gfc_typenode_for_spec (&expr->ts);
776 se->expr = fold_convert (type, build_call_expr (fndecl, 1, arg));
779 /* Evaluate a single upper or lower bound. */
780 /* TODO: bound intrinsic generates way too much unnecessary code. */
783 gfc_conv_intrinsic_bound (gfc_se * se, gfc_expr * expr, int upper)
785 gfc_actual_arglist *arg;
786 gfc_actual_arglist *arg2;
791 tree cond, cond1, cond2, cond3, cond4, size;
799 arg = expr->value.function.actual;
804 /* Create an implicit second parameter from the loop variable. */
805 gcc_assert (!arg2->expr);
806 gcc_assert (se->loop->dimen == 1);
807 gcc_assert (se->ss->expr == expr);
808 gfc_advance_se_ss_chain (se);
809 bound = se->loop->loopvar[0];
810 bound = fold_build2 (MINUS_EXPR, gfc_array_index_type, bound,
815 /* use the passed argument. */
816 gcc_assert (arg->next->expr);
817 gfc_init_se (&argse, NULL);
818 gfc_conv_expr_type (&argse, arg->next->expr, gfc_array_index_type);
819 gfc_add_block_to_block (&se->pre, &argse.pre);
821 /* Convert from one based to zero based. */
822 bound = fold_build2 (MINUS_EXPR, gfc_array_index_type, bound,
826 /* TODO: don't re-evaluate the descriptor on each iteration. */
827 /* Get a descriptor for the first parameter. */
828 ss = gfc_walk_expr (arg->expr);
829 gcc_assert (ss != gfc_ss_terminator);
830 gfc_init_se (&argse, NULL);
831 gfc_conv_expr_descriptor (&argse, arg->expr, ss);
832 gfc_add_block_to_block (&se->pre, &argse.pre);
833 gfc_add_block_to_block (&se->post, &argse.post);
837 if (INTEGER_CST_P (bound))
841 hi = TREE_INT_CST_HIGH (bound);
842 low = TREE_INT_CST_LOW (bound);
843 if (hi || low < 0 || low >= GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc)))
844 gfc_error ("'dim' argument of %s intrinsic at %L is not a valid "
845 "dimension index", upper ? "UBOUND" : "LBOUND",
850 if (flag_bounds_check)
852 bound = gfc_evaluate_now (bound, &se->pre);
853 cond = fold_build2 (LT_EXPR, boolean_type_node,
854 bound, build_int_cst (TREE_TYPE (bound), 0));
855 tmp = gfc_rank_cst[GFC_TYPE_ARRAY_RANK (TREE_TYPE (desc))];
856 tmp = fold_build2 (GE_EXPR, boolean_type_node, bound, tmp);
857 cond = fold_build2 (TRUTH_ORIF_EXPR, boolean_type_node, cond, tmp);
858 gfc_trans_runtime_check (cond, &se->pre, &expr->where, gfc_msg_fault);
862 ubound = gfc_conv_descriptor_ubound (desc, bound);
863 lbound = gfc_conv_descriptor_lbound (desc, bound);
865 /* Follow any component references. */
866 if (arg->expr->expr_type == EXPR_VARIABLE
867 || arg->expr->expr_type == EXPR_CONSTANT)
869 as = arg->expr->symtree->n.sym->as;
870 for (ref = arg->expr->ref; ref; ref = ref->next)
875 as = ref->u.c.component->as;
883 switch (ref->u.ar.type)
901 /* 13.14.53: Result value for LBOUND
903 Case (i): For an array section or for an array expression other than a
904 whole array or array structure component, LBOUND(ARRAY, DIM)
905 has the value 1. For a whole array or array structure
906 component, LBOUND(ARRAY, DIM) has the value:
907 (a) equal to the lower bound for subscript DIM of ARRAY if
908 dimension DIM of ARRAY does not have extent zero
909 or if ARRAY is an assumed-size array of rank DIM,
912 13.14.113: Result value for UBOUND
914 Case (i): For an array section or for an array expression other than a
915 whole array or array structure component, UBOUND(ARRAY, DIM)
916 has the value equal to the number of elements in the given
917 dimension; otherwise, it has a value equal to the upper bound
918 for subscript DIM of ARRAY if dimension DIM of ARRAY does
919 not have size zero and has value zero if dimension DIM has
924 tree stride = gfc_conv_descriptor_stride (desc, bound);
926 cond1 = fold_build2 (GE_EXPR, boolean_type_node, ubound, lbound);
927 cond2 = fold_build2 (LE_EXPR, boolean_type_node, ubound, lbound);
929 cond3 = fold_build2 (GE_EXPR, boolean_type_node, stride,
930 gfc_index_zero_node);
931 cond3 = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, cond3, cond1);
933 cond4 = fold_build2 (LT_EXPR, boolean_type_node, stride,
934 gfc_index_zero_node);
935 cond4 = fold_build2 (TRUTH_AND_EXPR, boolean_type_node, cond4, cond2);
939 cond = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, cond3, cond4);
941 se->expr = fold_build3 (COND_EXPR, gfc_array_index_type, cond,
942 ubound, gfc_index_zero_node);
946 if (as->type == AS_ASSUMED_SIZE)
947 cond = fold_build2 (EQ_EXPR, boolean_type_node, bound,
948 build_int_cst (TREE_TYPE (bound),
949 arg->expr->rank - 1));
951 cond = boolean_false_node;
953 cond1 = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, cond3, cond4);
954 cond = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, cond, cond1);
956 se->expr = fold_build3 (COND_EXPR, gfc_array_index_type, cond,
957 lbound, gfc_index_one_node);
964 size = fold_build2 (MINUS_EXPR, gfc_array_index_type, ubound, lbound);
965 se->expr = fold_build2 (PLUS_EXPR, gfc_array_index_type, size,
969 se->expr = gfc_index_one_node;
972 type = gfc_typenode_for_spec (&expr->ts);
973 se->expr = convert (type, se->expr);
978 gfc_conv_intrinsic_abs (gfc_se * se, gfc_expr * expr)
983 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
985 switch (expr->value.function.actual->expr->ts.type)
989 se->expr = build1 (ABS_EXPR, TREE_TYPE (arg), arg);
993 switch (expr->ts.kind)
1008 se->expr = build_call_expr (built_in_decls[n], 1, arg);
1017 /* Create a complex value from one or two real components. */
1020 gfc_conv_intrinsic_cmplx (gfc_se * se, gfc_expr * expr, int both)
1026 unsigned int num_args;
1028 num_args = gfc_intrinsic_argument_list_length (expr);
1029 args = alloca (sizeof (tree) * num_args);
1031 type = gfc_typenode_for_spec (&expr->ts);
1032 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
1033 real = convert (TREE_TYPE (type), args[0]);
1035 imag = convert (TREE_TYPE (type), args[1]);
1036 else if (TREE_CODE (TREE_TYPE (args[0])) == COMPLEX_TYPE)
1038 imag = build1 (IMAGPART_EXPR, TREE_TYPE (TREE_TYPE (args[0])), args[0]);
1039 imag = convert (TREE_TYPE (type), imag);
1042 imag = build_real_from_int_cst (TREE_TYPE (type), integer_zero_node);
1044 se->expr = fold_build2 (COMPLEX_EXPR, type, real, imag);
1047 /* Remainder function MOD(A, P) = A - INT(A / P) * P
1048 MODULO(A, P) = A - FLOOR (A / P) * P */
1049 /* TODO: MOD(x, 0) */
1052 gfc_conv_intrinsic_mod (gfc_se * se, gfc_expr * expr, int modulo)
1063 gfc_conv_intrinsic_function_args (se, expr, args, 2);
1065 switch (expr->ts.type)
1068 /* Integer case is easy, we've got a builtin op. */
1069 type = TREE_TYPE (args[0]);
1072 se->expr = build2 (FLOOR_MOD_EXPR, type, args[0], args[1]);
1074 se->expr = build2 (TRUNC_MOD_EXPR, type, args[0], args[1]);
1079 /* Check if we have a builtin fmod. */
1080 switch (expr->ts.kind)
1099 /* Use it if it exists. */
1100 if (n != END_BUILTINS)
1102 tmp = build_addr (built_in_decls[n], current_function_decl);
1103 se->expr = build_call_array (TREE_TYPE (TREE_TYPE (built_in_decls[n])),
1109 type = TREE_TYPE (args[0]);
1111 args[0] = gfc_evaluate_now (args[0], &se->pre);
1112 args[1] = gfc_evaluate_now (args[1], &se->pre);
1115 modulo = arg - floor (arg/arg2) * arg2, so
1116 = test ? fmod (arg, arg2) : fmod (arg, arg2) + arg2,
1118 test = (fmod (arg, arg2) != 0) && ((arg < 0) xor (arg2 < 0))
1119 thereby avoiding another division and retaining the accuracy
1120 of the builtin function. */
1121 if (n != END_BUILTINS && modulo)
1123 tree zero = gfc_build_const (type, integer_zero_node);
1124 tmp = gfc_evaluate_now (se->expr, &se->pre);
1125 test = build2 (LT_EXPR, boolean_type_node, args[0], zero);
1126 test2 = build2 (LT_EXPR, boolean_type_node, args[1], zero);
1127 test2 = build2 (TRUTH_XOR_EXPR, boolean_type_node, test, test2);
1128 test = build2 (NE_EXPR, boolean_type_node, tmp, zero);
1129 test = build2 (TRUTH_AND_EXPR, boolean_type_node, test, test2);
1130 test = gfc_evaluate_now (test, &se->pre);
1131 se->expr = build3 (COND_EXPR, type, test,
1132 build2 (PLUS_EXPR, type, tmp, args[1]), tmp);
1136 /* If we do not have a built_in fmod, the calculation is going to
1137 have to be done longhand. */
1138 tmp = build2 (RDIV_EXPR, type, args[0], args[1]);
1140 /* Test if the value is too large to handle sensibly. */
1141 gfc_set_model_kind (expr->ts.kind);
1143 n = gfc_validate_kind (BT_INTEGER, expr->ts.kind, true);
1144 ikind = expr->ts.kind;
1147 n = gfc_validate_kind (BT_INTEGER, gfc_max_integer_kind, false);
1148 ikind = gfc_max_integer_kind;
1150 mpfr_set_z (huge, gfc_integer_kinds[n].huge, GFC_RND_MODE);
1151 test = gfc_conv_mpfr_to_tree (huge, expr->ts.kind);
1152 test2 = build2 (LT_EXPR, boolean_type_node, tmp, test);
1154 mpfr_neg (huge, huge, GFC_RND_MODE);
1155 test = gfc_conv_mpfr_to_tree (huge, expr->ts.kind);
1156 test = build2 (GT_EXPR, boolean_type_node, tmp, test);
1157 test2 = build2 (TRUTH_AND_EXPR, boolean_type_node, test, test2);
1159 itype = gfc_get_int_type (ikind);
1161 tmp = build_fix_expr (&se->pre, tmp, itype, RND_FLOOR);
1163 tmp = build_fix_expr (&se->pre, tmp, itype, RND_TRUNC);
1164 tmp = convert (type, tmp);
1165 tmp = build3 (COND_EXPR, type, test2, tmp, args[0]);
1166 tmp = build2 (MULT_EXPR, type, tmp, args[1]);
1167 se->expr = build2 (MINUS_EXPR, type, args[0], tmp);
1176 /* Positive difference DIM (x, y) = ((x - y) < 0) ? 0 : x - y. */
1179 gfc_conv_intrinsic_dim (gfc_se * se, gfc_expr * expr)
1187 gfc_conv_intrinsic_function_args (se, expr, args, 2);
1188 type = TREE_TYPE (args[0]);
1190 val = build2 (MINUS_EXPR, type, args[0], args[1]);
1191 val = gfc_evaluate_now (val, &se->pre);
1193 zero = gfc_build_const (type, integer_zero_node);
1194 tmp = build2 (LE_EXPR, boolean_type_node, val, zero);
1195 se->expr = build3 (COND_EXPR, type, tmp, zero, val);
1199 /* SIGN(A, B) is absolute value of A times sign of B.
1200 The real value versions use library functions to ensure the correct
1201 handling of negative zero. Integer case implemented as:
1202 SIGN(A, B) = { tmp = (A ^ B) >> C; (A + tmp) ^ tmp }
1206 gfc_conv_intrinsic_sign (gfc_se * se, gfc_expr * expr)
1212 gfc_conv_intrinsic_function_args (se, expr, args, 2);
1213 if (expr->ts.type == BT_REAL)
1215 switch (expr->ts.kind)
1218 tmp = built_in_decls[BUILT_IN_COPYSIGNF];
1221 tmp = built_in_decls[BUILT_IN_COPYSIGN];
1225 tmp = built_in_decls[BUILT_IN_COPYSIGNL];
1230 se->expr = build_call_expr (tmp, 2, args[0], args[1]);
1234 /* Having excluded floating point types, we know we are now dealing
1235 with signed integer types. */
1236 type = TREE_TYPE (args[0]);
1238 /* Args[0] is used multiple times below. */
1239 args[0] = gfc_evaluate_now (args[0], &se->pre);
1241 /* Construct (A ^ B) >> 31, which generates a bit mask of all zeros if
1242 the signs of A and B are the same, and of all ones if they differ. */
1243 tmp = fold_build2 (BIT_XOR_EXPR, type, args[0], args[1]);
1244 tmp = fold_build2 (RSHIFT_EXPR, type, tmp,
1245 build_int_cst (type, TYPE_PRECISION (type) - 1));
1246 tmp = gfc_evaluate_now (tmp, &se->pre);
1248 /* Construct (A + tmp) ^ tmp, which is A if tmp is zero, and -A if tmp]
1249 is all ones (i.e. -1). */
1250 se->expr = fold_build2 (BIT_XOR_EXPR, type,
1251 fold_build2 (PLUS_EXPR, type, args[0], tmp),
1256 /* Test for the presence of an optional argument. */
1259 gfc_conv_intrinsic_present (gfc_se * se, gfc_expr * expr)
1263 arg = expr->value.function.actual->expr;
1264 gcc_assert (arg->expr_type == EXPR_VARIABLE);
1265 se->expr = gfc_conv_expr_present (arg->symtree->n.sym);
1266 se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr);
1270 /* Calculate the double precision product of two single precision values. */
1273 gfc_conv_intrinsic_dprod (gfc_se * se, gfc_expr * expr)
1278 gfc_conv_intrinsic_function_args (se, expr, args, 2);
1280 /* Convert the args to double precision before multiplying. */
1281 type = gfc_typenode_for_spec (&expr->ts);
1282 args[0] = convert (type, args[0]);
1283 args[1] = convert (type, args[1]);
1284 se->expr = build2 (MULT_EXPR, type, args[0], args[1]);
1288 /* Return a length one character string containing an ascii character. */
1291 gfc_conv_intrinsic_char (gfc_se * se, gfc_expr * expr)
1297 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
1299 /* We currently don't support character types != 1. */
1300 gcc_assert (expr->ts.kind == 1);
1301 type = gfc_character1_type_node;
1302 var = gfc_create_var (type, "char");
1304 arg = convert (type, arg);
1305 gfc_add_modify_expr (&se->pre, var, arg);
1306 se->expr = gfc_build_addr_expr (build_pointer_type (type), var);
1307 se->string_length = integer_one_node;
1312 gfc_conv_intrinsic_ctime (gfc_se * se, gfc_expr * expr)
1319 tree gfc_int8_type_node = gfc_get_int_type (8);
1322 unsigned int num_args;
1324 num_args = gfc_intrinsic_argument_list_length (expr) + 2;
1325 args = alloca (sizeof (tree) * num_args);
1327 type = build_pointer_type (gfc_character1_type_node);
1328 var = gfc_create_var (type, "pstr");
1329 len = gfc_create_var (gfc_int8_type_node, "len");
1331 gfc_conv_intrinsic_function_args (se, expr, &args[2], num_args - 2);
1332 args[0] = build_fold_addr_expr (var);
1333 args[1] = build_fold_addr_expr (len);
1335 fndecl = build_addr (gfor_fndecl_ctime, current_function_decl);
1336 tmp = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_ctime)),
1337 fndecl, num_args, args);
1338 gfc_add_expr_to_block (&se->pre, tmp);
1340 /* Free the temporary afterwards, if necessary. */
1341 cond = build2 (GT_EXPR, boolean_type_node, len,
1342 build_int_cst (TREE_TYPE (len), 0));
1343 tmp = gfc_call_free (var);
1344 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
1345 gfc_add_expr_to_block (&se->post, tmp);
1348 se->string_length = len;
1353 gfc_conv_intrinsic_fdate (gfc_se * se, gfc_expr * expr)
1360 tree gfc_int4_type_node = gfc_get_int_type (4);
1363 unsigned int num_args;
1365 num_args = gfc_intrinsic_argument_list_length (expr) + 2;
1366 args = alloca (sizeof (tree) * num_args);
1368 type = build_pointer_type (gfc_character1_type_node);
1369 var = gfc_create_var (type, "pstr");
1370 len = gfc_create_var (gfc_int4_type_node, "len");
1372 gfc_conv_intrinsic_function_args (se, expr, &args[2], num_args - 2);
1373 args[0] = build_fold_addr_expr (var);
1374 args[1] = build_fold_addr_expr (len);
1376 fndecl = build_addr (gfor_fndecl_fdate, current_function_decl);
1377 tmp = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_fdate)),
1378 fndecl, num_args, args);
1379 gfc_add_expr_to_block (&se->pre, tmp);
1381 /* Free the temporary afterwards, if necessary. */
1382 cond = build2 (GT_EXPR, boolean_type_node, len,
1383 build_int_cst (TREE_TYPE (len), 0));
1384 tmp = gfc_call_free (var);
1385 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
1386 gfc_add_expr_to_block (&se->post, tmp);
1389 se->string_length = len;
1393 /* Return a character string containing the tty name. */
1396 gfc_conv_intrinsic_ttynam (gfc_se * se, gfc_expr * expr)
1404 tree gfc_int4_type_node = gfc_get_int_type (4);
1406 unsigned int num_args;
1408 num_args = gfc_intrinsic_argument_list_length (expr) + 2;
1409 args = alloca (sizeof (tree) * num_args);
1411 type = build_pointer_type (gfc_character1_type_node);
1412 var = gfc_create_var (type, "pstr");
1413 len = gfc_create_var (gfc_int4_type_node, "len");
1415 gfc_conv_intrinsic_function_args (se, expr, &args[2], num_args - 2);
1416 args[0] = build_fold_addr_expr (var);
1417 args[1] = build_fold_addr_expr (len);
1419 fndecl = build_addr (gfor_fndecl_ttynam, current_function_decl);
1420 tmp = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_ttynam)),
1421 fndecl, num_args, args);
1422 gfc_add_expr_to_block (&se->pre, tmp);
1424 /* Free the temporary afterwards, if necessary. */
1425 cond = build2 (GT_EXPR, boolean_type_node, len,
1426 build_int_cst (TREE_TYPE (len), 0));
1427 tmp = gfc_call_free (var);
1428 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
1429 gfc_add_expr_to_block (&se->post, tmp);
1432 se->string_length = len;
1436 /* Get the minimum/maximum value of all the parameters.
1437 minmax (a1, a2, a3, ...)
1439 if (a2 .op. a1 || isnan(a1))
1443 if (a3 .op. mvar || isnan(mvar))
1450 /* TODO: Mismatching types can occur when specific names are used.
1451 These should be handled during resolution. */
1453 gfc_conv_intrinsic_minmax (gfc_se * se, gfc_expr * expr, int op)
1463 gfc_actual_arglist *argexpr;
1467 nargs = gfc_intrinsic_argument_list_length (expr);
1468 args = alloca (sizeof (tree) * nargs);
1470 gfc_conv_intrinsic_function_args (se, expr, args, nargs);
1471 type = gfc_typenode_for_spec (&expr->ts);
1473 /* The first and second arguments should be present, if they are
1474 optional dummy arguments. */
1475 argexpr = expr->value.function.actual;
1476 if (argexpr->expr->expr_type == EXPR_VARIABLE
1477 && argexpr->expr->symtree->n.sym->attr.optional
1478 && TREE_CODE (args[0]) == INDIRECT_REF)
1480 /* Check the first argument. */
1484 asprintf (&msg, "First argument of '%s' intrinsic should be present",
1485 expr->symtree->n.sym->name);
1486 cond = build2 (EQ_EXPR, boolean_type_node, TREE_OPERAND (args[0], 0),
1487 build_int_cst (TREE_TYPE (TREE_OPERAND (args[0], 0)), 0));
1488 gfc_trans_runtime_check (cond, &se->pre, &expr->where, msg);
1492 if (argexpr->next->expr->expr_type == EXPR_VARIABLE
1493 && argexpr->next->expr->symtree->n.sym->attr.optional
1494 && TREE_CODE (args[1]) == INDIRECT_REF)
1496 /* Check the second argument. */
1500 asprintf (&msg, "Second argument of '%s' intrinsic should be present",
1501 expr->symtree->n.sym->name);
1502 cond = build2 (EQ_EXPR, boolean_type_node, TREE_OPERAND (args[1], 0),
1503 build_int_cst (TREE_TYPE (TREE_OPERAND (args[1], 0)), 0));
1504 gfc_trans_runtime_check (cond, &se->pre, &expr->where, msg);
1509 if (TREE_TYPE (limit) != type)
1510 limit = convert (type, limit);
1511 /* Only evaluate the argument once. */
1512 if (TREE_CODE (limit) != VAR_DECL && !TREE_CONSTANT (limit))
1513 limit = gfc_evaluate_now (limit, &se->pre);
1515 mvar = gfc_create_var (type, "M");
1516 elsecase = build2_v (MODIFY_EXPR, mvar, limit);
1517 for (i = 1, argexpr = argexpr->next; i < nargs; i++)
1523 /* Handle absent optional arguments by ignoring the comparison. */
1524 if (i > 0 && argexpr->expr->expr_type == EXPR_VARIABLE
1525 && argexpr->expr->symtree->n.sym->attr.optional
1526 && TREE_CODE (val) == INDIRECT_REF)
1527 cond = build2 (NE_EXPR, boolean_type_node, TREE_OPERAND (val, 0),
1528 build_int_cst (TREE_TYPE (TREE_OPERAND (val, 0)), 0));
1533 /* Only evaluate the argument once. */
1534 if (TREE_CODE (val) != VAR_DECL && !TREE_CONSTANT (val))
1535 val = gfc_evaluate_now (val, &se->pre);
1538 thencase = build2_v (MODIFY_EXPR, mvar, convert (type, val));
1540 tmp = build2 (op, boolean_type_node, convert (type, val), limit);
1542 /* FIXME: When the IEEE_ARITHMETIC module is implemented, the call to
1543 __builtin_isnan might be made dependent on that module being loaded,
1544 to help performance of programs that don't rely on IEEE semantics. */
1545 if (FLOAT_TYPE_P (TREE_TYPE (limit)))
1547 isnan = build_call_expr (built_in_decls[BUILT_IN_ISNAN], 1, limit);
1548 tmp = fold_build2 (TRUTH_OR_EXPR, boolean_type_node, tmp,
1549 fold_convert (boolean_type_node, isnan));
1551 tmp = build3_v (COND_EXPR, tmp, thencase, elsecase);
1553 if (cond != NULL_TREE)
1554 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
1556 gfc_add_expr_to_block (&se->pre, tmp);
1557 elsecase = build_empty_stmt ();
1559 argexpr = argexpr->next;
1565 /* Generate library calls for MIN and MAX intrinsics for character
1568 gfc_conv_intrinsic_minmax_char (gfc_se * se, gfc_expr * expr, int op)
1571 tree var, len, fndecl, tmp, cond;
1574 nargs = gfc_intrinsic_argument_list_length (expr);
1575 args = alloca (sizeof (tree) * (nargs + 4));
1576 gfc_conv_intrinsic_function_args (se, expr, &args[4], nargs);
1578 /* Create the result variables. */
1579 len = gfc_create_var (gfc_charlen_type_node, "len");
1580 args[0] = build_fold_addr_expr (len);
1581 var = gfc_create_var (build_pointer_type (gfc_character1_type_node), "pstr");
1582 args[1] = gfc_build_addr_expr (ppvoid_type_node, var);
1583 args[2] = build_int_cst (NULL_TREE, op);
1584 args[3] = build_int_cst (NULL_TREE, nargs / 2);
1586 /* Make the function call. */
1587 fndecl = build_addr (gfor_fndecl_string_minmax, current_function_decl);
1588 tmp = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_string_minmax)),
1589 fndecl, nargs + 4, args);
1590 gfc_add_expr_to_block (&se->pre, tmp);
1592 /* Free the temporary afterwards, if necessary. */
1593 cond = build2 (GT_EXPR, boolean_type_node, len,
1594 build_int_cst (TREE_TYPE (len), 0));
1595 tmp = gfc_call_free (var);
1596 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
1597 gfc_add_expr_to_block (&se->post, tmp);
1600 se->string_length = len;
1604 /* Create a symbol node for this intrinsic. The symbol from the frontend
1605 has the generic name. */
1608 gfc_get_symbol_for_expr (gfc_expr * expr)
1612 /* TODO: Add symbols for intrinsic function to the global namespace. */
1613 gcc_assert (strlen (expr->value.function.name) <= GFC_MAX_SYMBOL_LEN - 5);
1614 sym = gfc_new_symbol (expr->value.function.name, NULL);
1617 sym->attr.external = 1;
1618 sym->attr.function = 1;
1619 sym->attr.always_explicit = 1;
1620 sym->attr.proc = PROC_INTRINSIC;
1621 sym->attr.flavor = FL_PROCEDURE;
1625 sym->attr.dimension = 1;
1626 sym->as = gfc_get_array_spec ();
1627 sym->as->type = AS_ASSUMED_SHAPE;
1628 sym->as->rank = expr->rank;
1631 /* TODO: proper argument lists for external intrinsics. */
1635 /* Generate a call to an external intrinsic function. */
1637 gfc_conv_intrinsic_funcall (gfc_se * se, gfc_expr * expr)
1642 gcc_assert (!se->ss || se->ss->expr == expr);
1645 gcc_assert (expr->rank > 0);
1647 gcc_assert (expr->rank == 0);
1649 sym = gfc_get_symbol_for_expr (expr);
1651 /* Calls to libgfortran_matmul need to be appended special arguments,
1652 to be able to call the BLAS ?gemm functions if required and possible. */
1653 append_args = NULL_TREE;
1654 if (expr->value.function.isym->id == GFC_ISYM_MATMUL
1655 && sym->ts.type != BT_LOGICAL)
1657 tree cint = gfc_get_int_type (gfc_c_int_kind);
1659 if (gfc_option.flag_external_blas
1660 && (sym->ts.type == BT_REAL || sym->ts.type == BT_COMPLEX)
1661 && (sym->ts.kind == gfc_default_real_kind
1662 || sym->ts.kind == gfc_default_double_kind))
1666 if (sym->ts.type == BT_REAL)
1668 if (sym->ts.kind == gfc_default_real_kind)
1669 gemm_fndecl = gfor_fndecl_sgemm;
1671 gemm_fndecl = gfor_fndecl_dgemm;
1675 if (sym->ts.kind == gfc_default_real_kind)
1676 gemm_fndecl = gfor_fndecl_cgemm;
1678 gemm_fndecl = gfor_fndecl_zgemm;
1681 append_args = gfc_chainon_list (NULL_TREE, build_int_cst (cint, 1));
1682 append_args = gfc_chainon_list
1683 (append_args, build_int_cst
1684 (cint, gfc_option.blas_matmul_limit));
1685 append_args = gfc_chainon_list (append_args,
1686 gfc_build_addr_expr (NULL_TREE,
1691 append_args = gfc_chainon_list (NULL_TREE, build_int_cst (cint, 0));
1692 append_args = gfc_chainon_list (append_args, build_int_cst (cint, 0));
1693 append_args = gfc_chainon_list (append_args, null_pointer_node);
1697 gfc_conv_function_call (se, sym, expr->value.function.actual, append_args);
1701 /* ANY and ALL intrinsics. ANY->op == NE_EXPR, ALL->op == EQ_EXPR.
1721 gfc_conv_intrinsic_anyall (gfc_se * se, gfc_expr * expr, int op)
1730 gfc_actual_arglist *actual;
1737 gfc_conv_intrinsic_funcall (se, expr);
1741 actual = expr->value.function.actual;
1742 type = gfc_typenode_for_spec (&expr->ts);
1743 /* Initialize the result. */
1744 resvar = gfc_create_var (type, "test");
1746 tmp = convert (type, boolean_true_node);
1748 tmp = convert (type, boolean_false_node);
1749 gfc_add_modify_expr (&se->pre, resvar, tmp);
1751 /* Walk the arguments. */
1752 arrayss = gfc_walk_expr (actual->expr);
1753 gcc_assert (arrayss != gfc_ss_terminator);
1755 /* Initialize the scalarizer. */
1756 gfc_init_loopinfo (&loop);
1757 exit_label = gfc_build_label_decl (NULL_TREE);
1758 TREE_USED (exit_label) = 1;
1759 gfc_add_ss_to_loop (&loop, arrayss);
1761 /* Initialize the loop. */
1762 gfc_conv_ss_startstride (&loop);
1763 gfc_conv_loop_setup (&loop);
1765 gfc_mark_ss_chain_used (arrayss, 1);
1766 /* Generate the loop body. */
1767 gfc_start_scalarized_body (&loop, &body);
1769 /* If the condition matches then set the return value. */
1770 gfc_start_block (&block);
1772 tmp = convert (type, boolean_false_node);
1774 tmp = convert (type, boolean_true_node);
1775 gfc_add_modify_expr (&block, resvar, tmp);
1777 /* And break out of the loop. */
1778 tmp = build1_v (GOTO_EXPR, exit_label);
1779 gfc_add_expr_to_block (&block, tmp);
1781 found = gfc_finish_block (&block);
1783 /* Check this element. */
1784 gfc_init_se (&arrayse, NULL);
1785 gfc_copy_loopinfo_to_se (&arrayse, &loop);
1786 arrayse.ss = arrayss;
1787 gfc_conv_expr_val (&arrayse, actual->expr);
1789 gfc_add_block_to_block (&body, &arrayse.pre);
1790 tmp = fold_build2 (op, boolean_type_node, arrayse.expr,
1791 build_int_cst (TREE_TYPE (arrayse.expr), 0));
1792 tmp = build3_v (COND_EXPR, tmp, found, build_empty_stmt ());
1793 gfc_add_expr_to_block (&body, tmp);
1794 gfc_add_block_to_block (&body, &arrayse.post);
1796 gfc_trans_scalarizing_loops (&loop, &body);
1798 /* Add the exit label. */
1799 tmp = build1_v (LABEL_EXPR, exit_label);
1800 gfc_add_expr_to_block (&loop.pre, tmp);
1802 gfc_add_block_to_block (&se->pre, &loop.pre);
1803 gfc_add_block_to_block (&se->pre, &loop.post);
1804 gfc_cleanup_loop (&loop);
1809 /* COUNT(A) = Number of true elements in A. */
1811 gfc_conv_intrinsic_count (gfc_se * se, gfc_expr * expr)
1818 gfc_actual_arglist *actual;
1824 gfc_conv_intrinsic_funcall (se, expr);
1828 actual = expr->value.function.actual;
1830 type = gfc_typenode_for_spec (&expr->ts);
1831 /* Initialize the result. */
1832 resvar = gfc_create_var (type, "count");
1833 gfc_add_modify_expr (&se->pre, resvar, build_int_cst (type, 0));
1835 /* Walk the arguments. */
1836 arrayss = gfc_walk_expr (actual->expr);
1837 gcc_assert (arrayss != gfc_ss_terminator);
1839 /* Initialize the scalarizer. */
1840 gfc_init_loopinfo (&loop);
1841 gfc_add_ss_to_loop (&loop, arrayss);
1843 /* Initialize the loop. */
1844 gfc_conv_ss_startstride (&loop);
1845 gfc_conv_loop_setup (&loop);
1847 gfc_mark_ss_chain_used (arrayss, 1);
1848 /* Generate the loop body. */
1849 gfc_start_scalarized_body (&loop, &body);
1851 tmp = build2 (PLUS_EXPR, TREE_TYPE (resvar), resvar,
1852 build_int_cst (TREE_TYPE (resvar), 1));
1853 tmp = build2_v (MODIFY_EXPR, resvar, tmp);
1855 gfc_init_se (&arrayse, NULL);
1856 gfc_copy_loopinfo_to_se (&arrayse, &loop);
1857 arrayse.ss = arrayss;
1858 gfc_conv_expr_val (&arrayse, actual->expr);
1859 tmp = build3_v (COND_EXPR, arrayse.expr, tmp, build_empty_stmt ());
1861 gfc_add_block_to_block (&body, &arrayse.pre);
1862 gfc_add_expr_to_block (&body, tmp);
1863 gfc_add_block_to_block (&body, &arrayse.post);
1865 gfc_trans_scalarizing_loops (&loop, &body);
1867 gfc_add_block_to_block (&se->pre, &loop.pre);
1868 gfc_add_block_to_block (&se->pre, &loop.post);
1869 gfc_cleanup_loop (&loop);
1874 /* Inline implementation of the sum and product intrinsics. */
1876 gfc_conv_intrinsic_arith (gfc_se * se, gfc_expr * expr, int op)
1884 gfc_actual_arglist *actual;
1889 gfc_expr *arrayexpr;
1894 gfc_conv_intrinsic_funcall (se, expr);
1898 type = gfc_typenode_for_spec (&expr->ts);
1899 /* Initialize the result. */
1900 resvar = gfc_create_var (type, "val");
1901 if (op == PLUS_EXPR)
1902 tmp = gfc_build_const (type, integer_zero_node);
1904 tmp = gfc_build_const (type, integer_one_node);
1906 gfc_add_modify_expr (&se->pre, resvar, tmp);
1908 /* Walk the arguments. */
1909 actual = expr->value.function.actual;
1910 arrayexpr = actual->expr;
1911 arrayss = gfc_walk_expr (arrayexpr);
1912 gcc_assert (arrayss != gfc_ss_terminator);
1914 actual = actual->next->next;
1915 gcc_assert (actual);
1916 maskexpr = actual->expr;
1917 if (maskexpr && maskexpr->rank != 0)
1919 maskss = gfc_walk_expr (maskexpr);
1920 gcc_assert (maskss != gfc_ss_terminator);
1925 /* Initialize the scalarizer. */
1926 gfc_init_loopinfo (&loop);
1927 gfc_add_ss_to_loop (&loop, arrayss);
1929 gfc_add_ss_to_loop (&loop, maskss);
1931 /* Initialize the loop. */
1932 gfc_conv_ss_startstride (&loop);
1933 gfc_conv_loop_setup (&loop);
1935 gfc_mark_ss_chain_used (arrayss, 1);
1937 gfc_mark_ss_chain_used (maskss, 1);
1938 /* Generate the loop body. */
1939 gfc_start_scalarized_body (&loop, &body);
1941 /* If we have a mask, only add this element if the mask is set. */
1944 gfc_init_se (&maskse, NULL);
1945 gfc_copy_loopinfo_to_se (&maskse, &loop);
1947 gfc_conv_expr_val (&maskse, maskexpr);
1948 gfc_add_block_to_block (&body, &maskse.pre);
1950 gfc_start_block (&block);
1953 gfc_init_block (&block);
1955 /* Do the actual summation/product. */
1956 gfc_init_se (&arrayse, NULL);
1957 gfc_copy_loopinfo_to_se (&arrayse, &loop);
1958 arrayse.ss = arrayss;
1959 gfc_conv_expr_val (&arrayse, arrayexpr);
1960 gfc_add_block_to_block (&block, &arrayse.pre);
1962 tmp = build2 (op, type, resvar, arrayse.expr);
1963 gfc_add_modify_expr (&block, resvar, tmp);
1964 gfc_add_block_to_block (&block, &arrayse.post);
1968 /* We enclose the above in if (mask) {...} . */
1969 tmp = gfc_finish_block (&block);
1971 tmp = build3_v (COND_EXPR, maskse.expr, tmp, build_empty_stmt ());
1974 tmp = gfc_finish_block (&block);
1975 gfc_add_expr_to_block (&body, tmp);
1977 gfc_trans_scalarizing_loops (&loop, &body);
1979 /* For a scalar mask, enclose the loop in an if statement. */
1980 if (maskexpr && maskss == NULL)
1982 gfc_init_se (&maskse, NULL);
1983 gfc_conv_expr_val (&maskse, maskexpr);
1984 gfc_init_block (&block);
1985 gfc_add_block_to_block (&block, &loop.pre);
1986 gfc_add_block_to_block (&block, &loop.post);
1987 tmp = gfc_finish_block (&block);
1989 tmp = build3_v (COND_EXPR, maskse.expr, tmp, build_empty_stmt ());
1990 gfc_add_expr_to_block (&block, tmp);
1991 gfc_add_block_to_block (&se->pre, &block);
1995 gfc_add_block_to_block (&se->pre, &loop.pre);
1996 gfc_add_block_to_block (&se->pre, &loop.post);
1999 gfc_cleanup_loop (&loop);
2005 /* Inline implementation of the dot_product intrinsic. This function
2006 is based on gfc_conv_intrinsic_arith (the previous function). */
2008 gfc_conv_intrinsic_dot_product (gfc_se * se, gfc_expr * expr)
2016 gfc_actual_arglist *actual;
2017 gfc_ss *arrayss1, *arrayss2;
2018 gfc_se arrayse1, arrayse2;
2019 gfc_expr *arrayexpr1, *arrayexpr2;
2021 type = gfc_typenode_for_spec (&expr->ts);
2023 /* Initialize the result. */
2024 resvar = gfc_create_var (type, "val");
2025 if (expr->ts.type == BT_LOGICAL)
2026 tmp = build_int_cst (type, 0);
2028 tmp = gfc_build_const (type, integer_zero_node);
2030 gfc_add_modify_expr (&se->pre, resvar, tmp);
2032 /* Walk argument #1. */
2033 actual = expr->value.function.actual;
2034 arrayexpr1 = actual->expr;
2035 arrayss1 = gfc_walk_expr (arrayexpr1);
2036 gcc_assert (arrayss1 != gfc_ss_terminator);
2038 /* Walk argument #2. */
2039 actual = actual->next;
2040 arrayexpr2 = actual->expr;
2041 arrayss2 = gfc_walk_expr (arrayexpr2);
2042 gcc_assert (arrayss2 != gfc_ss_terminator);
2044 /* Initialize the scalarizer. */
2045 gfc_init_loopinfo (&loop);
2046 gfc_add_ss_to_loop (&loop, arrayss1);
2047 gfc_add_ss_to_loop (&loop, arrayss2);
2049 /* Initialize the loop. */
2050 gfc_conv_ss_startstride (&loop);
2051 gfc_conv_loop_setup (&loop);
2053 gfc_mark_ss_chain_used (arrayss1, 1);
2054 gfc_mark_ss_chain_used (arrayss2, 1);
2056 /* Generate the loop body. */
2057 gfc_start_scalarized_body (&loop, &body);
2058 gfc_init_block (&block);
2060 /* Make the tree expression for [conjg(]array1[)]. */
2061 gfc_init_se (&arrayse1, NULL);
2062 gfc_copy_loopinfo_to_se (&arrayse1, &loop);
2063 arrayse1.ss = arrayss1;
2064 gfc_conv_expr_val (&arrayse1, arrayexpr1);
2065 if (expr->ts.type == BT_COMPLEX)
2066 arrayse1.expr = build1 (CONJ_EXPR, type, arrayse1.expr);
2067 gfc_add_block_to_block (&block, &arrayse1.pre);
2069 /* Make the tree expression for array2. */
2070 gfc_init_se (&arrayse2, NULL);
2071 gfc_copy_loopinfo_to_se (&arrayse2, &loop);
2072 arrayse2.ss = arrayss2;
2073 gfc_conv_expr_val (&arrayse2, arrayexpr2);
2074 gfc_add_block_to_block (&block, &arrayse2.pre);
2076 /* Do the actual product and sum. */
2077 if (expr->ts.type == BT_LOGICAL)
2079 tmp = build2 (TRUTH_AND_EXPR, type, arrayse1.expr, arrayse2.expr);
2080 tmp = build2 (TRUTH_OR_EXPR, type, resvar, tmp);
2084 tmp = build2 (MULT_EXPR, type, arrayse1.expr, arrayse2.expr);
2085 tmp = build2 (PLUS_EXPR, type, resvar, tmp);
2087 gfc_add_modify_expr (&block, resvar, tmp);
2089 /* Finish up the loop block and the loop. */
2090 tmp = gfc_finish_block (&block);
2091 gfc_add_expr_to_block (&body, tmp);
2093 gfc_trans_scalarizing_loops (&loop, &body);
2094 gfc_add_block_to_block (&se->pre, &loop.pre);
2095 gfc_add_block_to_block (&se->pre, &loop.post);
2096 gfc_cleanup_loop (&loop);
2103 gfc_conv_intrinsic_minmaxloc (gfc_se * se, gfc_expr * expr, int op)
2107 stmtblock_t ifblock;
2108 stmtblock_t elseblock;
2116 gfc_actual_arglist *actual;
2121 gfc_expr *arrayexpr;
2128 gfc_conv_intrinsic_funcall (se, expr);
2132 /* Initialize the result. */
2133 pos = gfc_create_var (gfc_array_index_type, "pos");
2134 offset = gfc_create_var (gfc_array_index_type, "offset");
2135 type = gfc_typenode_for_spec (&expr->ts);
2137 /* Walk the arguments. */
2138 actual = expr->value.function.actual;
2139 arrayexpr = actual->expr;
2140 arrayss = gfc_walk_expr (arrayexpr);
2141 gcc_assert (arrayss != gfc_ss_terminator);
2143 actual = actual->next->next;
2144 gcc_assert (actual);
2145 maskexpr = actual->expr;
2146 if (maskexpr && maskexpr->rank != 0)
2148 maskss = gfc_walk_expr (maskexpr);
2149 gcc_assert (maskss != gfc_ss_terminator);
2154 limit = gfc_create_var (gfc_typenode_for_spec (&arrayexpr->ts), "limit");
2155 n = gfc_validate_kind (arrayexpr->ts.type, arrayexpr->ts.kind, false);
2156 switch (arrayexpr->ts.type)
2159 tmp = gfc_conv_mpfr_to_tree (gfc_real_kinds[n].huge, arrayexpr->ts.kind);
2163 tmp = gfc_conv_mpz_to_tree (gfc_integer_kinds[n].huge,
2164 arrayexpr->ts.kind);
2171 /* We start with the most negative possible value for MAXLOC, and the most
2172 positive possible value for MINLOC. The most negative possible value is
2173 -HUGE for BT_REAL and (-HUGE - 1) for BT_INTEGER; the most positive
2174 possible value is HUGE in both cases. */
2176 tmp = fold_build1 (NEGATE_EXPR, TREE_TYPE (tmp), tmp);
2177 gfc_add_modify_expr (&se->pre, limit, tmp);
2179 if (op == GT_EXPR && expr->ts.type == BT_INTEGER)
2180 tmp = build2 (MINUS_EXPR, TREE_TYPE (tmp), tmp,
2181 build_int_cst (type, 1));
2183 /* Initialize the scalarizer. */
2184 gfc_init_loopinfo (&loop);
2185 gfc_add_ss_to_loop (&loop, arrayss);
2187 gfc_add_ss_to_loop (&loop, maskss);
2189 /* Initialize the loop. */
2190 gfc_conv_ss_startstride (&loop);
2191 gfc_conv_loop_setup (&loop);
2193 gcc_assert (loop.dimen == 1);
2195 /* Initialize the position to zero, following Fortran 2003. We are free
2196 to do this because Fortran 95 allows the result of an entirely false
2197 mask to be processor dependent. */
2198 gfc_add_modify_expr (&loop.pre, pos, gfc_index_zero_node);
2200 gfc_mark_ss_chain_used (arrayss, 1);
2202 gfc_mark_ss_chain_used (maskss, 1);
2203 /* Generate the loop body. */
2204 gfc_start_scalarized_body (&loop, &body);
2206 /* If we have a mask, only check this element if the mask is set. */
2209 gfc_init_se (&maskse, NULL);
2210 gfc_copy_loopinfo_to_se (&maskse, &loop);
2212 gfc_conv_expr_val (&maskse, maskexpr);
2213 gfc_add_block_to_block (&body, &maskse.pre);
2215 gfc_start_block (&block);
2218 gfc_init_block (&block);
2220 /* Compare with the current limit. */
2221 gfc_init_se (&arrayse, NULL);
2222 gfc_copy_loopinfo_to_se (&arrayse, &loop);
2223 arrayse.ss = arrayss;
2224 gfc_conv_expr_val (&arrayse, arrayexpr);
2225 gfc_add_block_to_block (&block, &arrayse.pre);
2227 /* We do the following if this is a more extreme value. */
2228 gfc_start_block (&ifblock);
2230 /* Assign the value to the limit... */
2231 gfc_add_modify_expr (&ifblock, limit, arrayse.expr);
2233 /* Remember where we are. An offset must be added to the loop
2234 counter to obtain the required position. */
2236 tmp = build_int_cst (gfc_array_index_type, 1);
2238 tmp =fold_build2 (MINUS_EXPR, gfc_array_index_type,
2239 gfc_index_one_node, loop.from[0]);
2240 gfc_add_modify_expr (&block, offset, tmp);
2242 tmp = build2 (PLUS_EXPR, TREE_TYPE (pos),
2243 loop.loopvar[0], offset);
2244 gfc_add_modify_expr (&ifblock, pos, tmp);
2246 ifbody = gfc_finish_block (&ifblock);
2248 /* If it is a more extreme value or pos is still zero and the value
2249 equal to the limit. */
2250 tmp = build2 (TRUTH_AND_EXPR, boolean_type_node,
2251 build2 (EQ_EXPR, boolean_type_node, pos, gfc_index_zero_node),
2252 build2 (EQ_EXPR, boolean_type_node, arrayse.expr, limit));
2253 tmp = build2 (TRUTH_OR_EXPR, boolean_type_node,
2254 build2 (op, boolean_type_node, arrayse.expr, limit), tmp);
2255 tmp = build3_v (COND_EXPR, tmp, ifbody, build_empty_stmt ());
2256 gfc_add_expr_to_block (&block, tmp);
2260 /* We enclose the above in if (mask) {...}. */
2261 tmp = gfc_finish_block (&block);
2263 tmp = build3_v (COND_EXPR, maskse.expr, tmp, build_empty_stmt ());
2266 tmp = gfc_finish_block (&block);
2267 gfc_add_expr_to_block (&body, tmp);
2269 gfc_trans_scalarizing_loops (&loop, &body);
2271 /* For a scalar mask, enclose the loop in an if statement. */
2272 if (maskexpr && maskss == NULL)
2274 gfc_init_se (&maskse, NULL);
2275 gfc_conv_expr_val (&maskse, maskexpr);
2276 gfc_init_block (&block);
2277 gfc_add_block_to_block (&block, &loop.pre);
2278 gfc_add_block_to_block (&block, &loop.post);
2279 tmp = gfc_finish_block (&block);
2281 /* For the else part of the scalar mask, just initialize
2282 the pos variable the same way as above. */
2284 gfc_init_block (&elseblock);
2285 gfc_add_modify_expr (&elseblock, pos, gfc_index_zero_node);
2286 elsetmp = gfc_finish_block (&elseblock);
2288 tmp = build3_v (COND_EXPR, maskse.expr, tmp, elsetmp);
2289 gfc_add_expr_to_block (&block, tmp);
2290 gfc_add_block_to_block (&se->pre, &block);
2294 gfc_add_block_to_block (&se->pre, &loop.pre);
2295 gfc_add_block_to_block (&se->pre, &loop.post);
2297 gfc_cleanup_loop (&loop);
2299 se->expr = convert (type, pos);
2303 gfc_conv_intrinsic_minmaxval (gfc_se * se, gfc_expr * expr, int op)
2312 gfc_actual_arglist *actual;
2317 gfc_expr *arrayexpr;
2323 gfc_conv_intrinsic_funcall (se, expr);
2327 type = gfc_typenode_for_spec (&expr->ts);
2328 /* Initialize the result. */
2329 limit = gfc_create_var (type, "limit");
2330 n = gfc_validate_kind (expr->ts.type, expr->ts.kind, false);
2331 switch (expr->ts.type)
2334 tmp = gfc_conv_mpfr_to_tree (gfc_real_kinds[n].huge, expr->ts.kind);
2338 tmp = gfc_conv_mpz_to_tree (gfc_integer_kinds[n].huge, expr->ts.kind);
2345 /* We start with the most negative possible value for MAXVAL, and the most
2346 positive possible value for MINVAL. The most negative possible value is
2347 -HUGE for BT_REAL and (-HUGE - 1) for BT_INTEGER; the most positive
2348 possible value is HUGE in both cases. */
2350 tmp = fold_build1 (NEGATE_EXPR, TREE_TYPE (tmp), tmp);
2352 if (op == GT_EXPR && expr->ts.type == BT_INTEGER)
2353 tmp = build2 (MINUS_EXPR, TREE_TYPE (tmp), tmp,
2354 build_int_cst (type, 1));
2356 gfc_add_modify_expr (&se->pre, limit, tmp);
2358 /* Walk the arguments. */
2359 actual = expr->value.function.actual;
2360 arrayexpr = actual->expr;
2361 arrayss = gfc_walk_expr (arrayexpr);
2362 gcc_assert (arrayss != gfc_ss_terminator);
2364 actual = actual->next->next;
2365 gcc_assert (actual);
2366 maskexpr = actual->expr;
2367 if (maskexpr && maskexpr->rank != 0)
2369 maskss = gfc_walk_expr (maskexpr);
2370 gcc_assert (maskss != gfc_ss_terminator);
2375 /* Initialize the scalarizer. */
2376 gfc_init_loopinfo (&loop);
2377 gfc_add_ss_to_loop (&loop, arrayss);
2379 gfc_add_ss_to_loop (&loop, maskss);
2381 /* Initialize the loop. */
2382 gfc_conv_ss_startstride (&loop);
2383 gfc_conv_loop_setup (&loop);
2385 gfc_mark_ss_chain_used (arrayss, 1);
2387 gfc_mark_ss_chain_used (maskss, 1);
2388 /* Generate the loop body. */
2389 gfc_start_scalarized_body (&loop, &body);
2391 /* If we have a mask, only add this element if the mask is set. */
2394 gfc_init_se (&maskse, NULL);
2395 gfc_copy_loopinfo_to_se (&maskse, &loop);
2397 gfc_conv_expr_val (&maskse, maskexpr);
2398 gfc_add_block_to_block (&body, &maskse.pre);
2400 gfc_start_block (&block);
2403 gfc_init_block (&block);
2405 /* Compare with the current limit. */
2406 gfc_init_se (&arrayse, NULL);
2407 gfc_copy_loopinfo_to_se (&arrayse, &loop);
2408 arrayse.ss = arrayss;
2409 gfc_conv_expr_val (&arrayse, arrayexpr);
2410 gfc_add_block_to_block (&block, &arrayse.pre);
2412 /* Assign the value to the limit... */
2413 ifbody = build2_v (MODIFY_EXPR, limit, arrayse.expr);
2415 /* If it is a more extreme value. */
2416 tmp = build2 (op, boolean_type_node, arrayse.expr, limit);
2417 tmp = build3_v (COND_EXPR, tmp, ifbody, build_empty_stmt ());
2418 gfc_add_expr_to_block (&block, tmp);
2419 gfc_add_block_to_block (&block, &arrayse.post);
2421 tmp = gfc_finish_block (&block);
2423 /* We enclose the above in if (mask) {...}. */
2424 tmp = build3_v (COND_EXPR, maskse.expr, tmp, build_empty_stmt ());
2425 gfc_add_expr_to_block (&body, tmp);
2427 gfc_trans_scalarizing_loops (&loop, &body);
2429 /* For a scalar mask, enclose the loop in an if statement. */
2430 if (maskexpr && maskss == NULL)
2432 gfc_init_se (&maskse, NULL);
2433 gfc_conv_expr_val (&maskse, maskexpr);
2434 gfc_init_block (&block);
2435 gfc_add_block_to_block (&block, &loop.pre);
2436 gfc_add_block_to_block (&block, &loop.post);
2437 tmp = gfc_finish_block (&block);
2439 tmp = build3_v (COND_EXPR, maskse.expr, tmp, build_empty_stmt ());
2440 gfc_add_expr_to_block (&block, tmp);
2441 gfc_add_block_to_block (&se->pre, &block);
2445 gfc_add_block_to_block (&se->pre, &loop.pre);
2446 gfc_add_block_to_block (&se->pre, &loop.post);
2449 gfc_cleanup_loop (&loop);
2454 /* BTEST (i, pos) = (i & (1 << pos)) != 0. */
2456 gfc_conv_intrinsic_btest (gfc_se * se, gfc_expr * expr)
2462 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2463 type = TREE_TYPE (args[0]);
2465 tmp = build2 (LSHIFT_EXPR, type, build_int_cst (type, 1), args[1]);
2466 tmp = build2 (BIT_AND_EXPR, type, args[0], tmp);
2467 tmp = fold_build2 (NE_EXPR, boolean_type_node, tmp,
2468 build_int_cst (type, 0));
2469 type = gfc_typenode_for_spec (&expr->ts);
2470 se->expr = convert (type, tmp);
2473 /* Generate code to perform the specified operation. */
2475 gfc_conv_intrinsic_bitop (gfc_se * se, gfc_expr * expr, int op)
2479 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2480 se->expr = fold_build2 (op, TREE_TYPE (args[0]), args[0], args[1]);
2485 gfc_conv_intrinsic_not (gfc_se * se, gfc_expr * expr)
2489 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
2490 se->expr = build1 (BIT_NOT_EXPR, TREE_TYPE (arg), arg);
2493 /* Set or clear a single bit. */
2495 gfc_conv_intrinsic_singlebitop (gfc_se * se, gfc_expr * expr, int set)
2502 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2503 type = TREE_TYPE (args[0]);
2505 tmp = fold_build2 (LSHIFT_EXPR, type, build_int_cst (type, 1), args[1]);
2511 tmp = fold_build1 (BIT_NOT_EXPR, type, tmp);
2513 se->expr = fold_build2 (op, type, args[0], tmp);
2516 /* Extract a sequence of bits.
2517 IBITS(I, POS, LEN) = (I >> POS) & ~((~0) << LEN). */
2519 gfc_conv_intrinsic_ibits (gfc_se * se, gfc_expr * expr)
2526 gfc_conv_intrinsic_function_args (se, expr, args, 3);
2527 type = TREE_TYPE (args[0]);
2529 mask = build_int_cst (type, -1);
2530 mask = build2 (LSHIFT_EXPR, type, mask, args[2]);
2531 mask = build1 (BIT_NOT_EXPR, type, mask);
2533 tmp = build2 (RSHIFT_EXPR, type, args[0], args[1]);
2535 se->expr = fold_build2 (BIT_AND_EXPR, type, tmp, mask);
2538 /* RSHIFT (I, SHIFT) = I >> SHIFT
2539 LSHIFT (I, SHIFT) = I << SHIFT */
2541 gfc_conv_intrinsic_rlshift (gfc_se * se, gfc_expr * expr, int right_shift)
2545 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2547 se->expr = fold_build2 (right_shift ? RSHIFT_EXPR : LSHIFT_EXPR,
2548 TREE_TYPE (args[0]), args[0], args[1]);
2551 /* ISHFT (I, SHIFT) = (abs (shift) >= BIT_SIZE (i))
2553 : ((shift >= 0) ? i << shift : i >> -shift)
2554 where all shifts are logical shifts. */
2556 gfc_conv_intrinsic_ishft (gfc_se * se, gfc_expr * expr)
2568 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2569 type = TREE_TYPE (args[0]);
2570 utype = unsigned_type_for (type);
2572 width = fold_build1 (ABS_EXPR, TREE_TYPE (args[1]), args[1]);
2574 /* Left shift if positive. */
2575 lshift = fold_build2 (LSHIFT_EXPR, type, args[0], width);
2577 /* Right shift if negative.
2578 We convert to an unsigned type because we want a logical shift.
2579 The standard doesn't define the case of shifting negative
2580 numbers, and we try to be compatible with other compilers, most
2581 notably g77, here. */
2582 rshift = fold_convert (type, build2 (RSHIFT_EXPR, utype,
2583 convert (utype, args[0]), width));
2585 tmp = fold_build2 (GE_EXPR, boolean_type_node, args[1],
2586 build_int_cst (TREE_TYPE (args[1]), 0));
2587 tmp = fold_build3 (COND_EXPR, type, tmp, lshift, rshift);
2589 /* The Fortran standard allows shift widths <= BIT_SIZE(I), whereas
2590 gcc requires a shift width < BIT_SIZE(I), so we have to catch this
2592 num_bits = build_int_cst (TREE_TYPE (args[0]), TYPE_PRECISION (type));
2593 cond = fold_build2 (GE_EXPR, boolean_type_node, width, num_bits);
2595 se->expr = fold_build3 (COND_EXPR, type, cond,
2596 build_int_cst (type, 0), tmp);
2600 /* Circular shift. AKA rotate or barrel shift. */
2603 gfc_conv_intrinsic_ishftc (gfc_se * se, gfc_expr * expr)
2611 unsigned int num_args;
2613 num_args = gfc_intrinsic_argument_list_length (expr);
2614 args = alloca (sizeof (tree) * num_args);
2616 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
2620 /* Use a library function for the 3 parameter version. */
2621 tree int4type = gfc_get_int_type (4);
2623 type = TREE_TYPE (args[0]);
2624 /* We convert the first argument to at least 4 bytes, and
2625 convert back afterwards. This removes the need for library
2626 functions for all argument sizes, and function will be
2627 aligned to at least 32 bits, so there's no loss. */
2628 if (expr->ts.kind < 4)
2629 args[0] = convert (int4type, args[0]);
2631 /* Convert the SHIFT and SIZE args to INTEGER*4 otherwise we would
2632 need loads of library functions. They cannot have values >
2633 BIT_SIZE (I) so the conversion is safe. */
2634 args[1] = convert (int4type, args[1]);
2635 args[2] = convert (int4type, args[2]);
2637 switch (expr->ts.kind)
2642 tmp = gfor_fndecl_math_ishftc4;
2645 tmp = gfor_fndecl_math_ishftc8;
2648 tmp = gfor_fndecl_math_ishftc16;
2653 se->expr = build_call_expr (tmp, 3, args[0], args[1], args[2]);
2654 /* Convert the result back to the original type, if we extended
2655 the first argument's width above. */
2656 if (expr->ts.kind < 4)
2657 se->expr = convert (type, se->expr);
2661 type = TREE_TYPE (args[0]);
2663 /* Rotate left if positive. */
2664 lrot = fold_build2 (LROTATE_EXPR, type, args[0], args[1]);
2666 /* Rotate right if negative. */
2667 tmp = fold_build1 (NEGATE_EXPR, TREE_TYPE (args[1]), args[1]);
2668 rrot = fold_build2 (RROTATE_EXPR, type, args[0], tmp);
2670 zero = build_int_cst (TREE_TYPE (args[1]), 0);
2671 tmp = fold_build2 (GT_EXPR, boolean_type_node, args[1], zero);
2672 rrot = fold_build3 (COND_EXPR, type, tmp, lrot, rrot);
2674 /* Do nothing if shift == 0. */
2675 tmp = fold_build2 (EQ_EXPR, boolean_type_node, args[1], zero);
2676 se->expr = fold_build3 (COND_EXPR, type, tmp, args[0], rrot);
2679 /* The length of a character string. */
2681 gfc_conv_intrinsic_len (gfc_se * se, gfc_expr * expr)
2691 gcc_assert (!se->ss);
2693 arg = expr->value.function.actual->expr;
2695 type = gfc_typenode_for_spec (&expr->ts);
2696 switch (arg->expr_type)
2699 len = build_int_cst (NULL_TREE, arg->value.character.length);
2703 /* Obtain the string length from the function used by
2704 trans-array.c(gfc_trans_array_constructor). */
2706 get_array_ctor_strlen (&se->pre, arg->value.constructor, &len);
2710 if (arg->ref == NULL
2711 || (arg->ref->next == NULL && arg->ref->type == REF_ARRAY))
2713 /* This doesn't catch all cases.
2714 See http://gcc.gnu.org/ml/fortran/2004-06/msg00165.html
2715 and the surrounding thread. */
2716 sym = arg->symtree->n.sym;
2717 decl = gfc_get_symbol_decl (sym);
2718 if (decl == current_function_decl && sym->attr.function
2719 && (sym->result == sym))
2720 decl = gfc_get_fake_result_decl (sym, 0);
2722 len = sym->ts.cl->backend_decl;
2727 /* Otherwise fall through. */
2730 /* Anybody stupid enough to do this deserves inefficient code. */
2731 ss = gfc_walk_expr (arg);
2732 gfc_init_se (&argse, se);
2733 if (ss == gfc_ss_terminator)
2734 gfc_conv_expr (&argse, arg);
2736 gfc_conv_expr_descriptor (&argse, arg, ss);
2737 gfc_add_block_to_block (&se->pre, &argse.pre);
2738 gfc_add_block_to_block (&se->post, &argse.post);
2739 len = argse.string_length;
2742 se->expr = convert (type, len);
2745 /* The length of a character string not including trailing blanks. */
2747 gfc_conv_intrinsic_len_trim (gfc_se * se, gfc_expr * expr)
2752 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2753 type = gfc_typenode_for_spec (&expr->ts);
2754 se->expr = build_call_expr (gfor_fndecl_string_len_trim, 2, args[0], args[1]);
2755 se->expr = convert (type, se->expr);
2759 /* Returns the starting position of a substring within a string. */
2762 gfc_conv_intrinsic_index (gfc_se * se, gfc_expr * expr)
2764 tree logical4_type_node = gfc_get_logical_type (4);
2768 unsigned int num_args;
2770 num_args = gfc_intrinsic_argument_list_length (expr);
2771 args = alloca (sizeof (tree) * 5);
2773 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
2774 type = gfc_typenode_for_spec (&expr->ts);
2777 args[4] = build_int_cst (logical4_type_node, 0);
2780 gcc_assert (num_args == 5);
2781 args[4] = convert (logical4_type_node, args[4]);
2784 fndecl = build_addr (gfor_fndecl_string_index, current_function_decl);
2785 se->expr = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_string_index)),
2787 se->expr = convert (type, se->expr);
2791 /* The ascii value for a single character. */
2793 gfc_conv_intrinsic_ichar (gfc_se * se, gfc_expr * expr)
2798 gfc_conv_intrinsic_function_args (se, expr, args, 2);
2799 gcc_assert (POINTER_TYPE_P (TREE_TYPE (args[1])));
2800 args[1] = build1 (NOP_EXPR, pchar_type_node, args[1]);
2801 type = gfc_typenode_for_spec (&expr->ts);
2803 se->expr = build_fold_indirect_ref (args[1]);
2804 se->expr = convert (type, se->expr);
2808 /* Intrinsic ISNAN calls __builtin_isnan. */
2811 gfc_conv_intrinsic_isnan (gfc_se * se, gfc_expr * expr)
2815 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
2816 se->expr = build_call_expr (built_in_decls[BUILT_IN_ISNAN], 1, arg);
2817 se->expr = fold_convert (gfc_typenode_for_spec (&expr->ts), se->expr);
2820 /* MERGE (tsource, fsource, mask) = mask ? tsource : fsource. */
2823 gfc_conv_intrinsic_merge (gfc_se * se, gfc_expr * expr)
2831 unsigned int num_args;
2833 num_args = gfc_intrinsic_argument_list_length (expr);
2834 args = alloca (sizeof (tree) * num_args);
2836 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
2837 if (expr->ts.type != BT_CHARACTER)
2845 /* We do the same as in the non-character case, but the argument
2846 list is different because of the string length arguments. We
2847 also have to set the string length for the result. */
2853 se->string_length = len;
2855 type = TREE_TYPE (tsource);
2856 se->expr = fold_build3 (COND_EXPR, type, mask, tsource, fsource);
2861 gfc_conv_intrinsic_size (gfc_se * se, gfc_expr * expr)
2863 gfc_actual_arglist *actual;
2871 gfc_init_se (&argse, NULL);
2872 actual = expr->value.function.actual;
2874 ss = gfc_walk_expr (actual->expr);
2875 gcc_assert (ss != gfc_ss_terminator);
2876 argse.want_pointer = 1;
2877 argse.data_not_needed = 1;
2878 gfc_conv_expr_descriptor (&argse, actual->expr, ss);
2879 gfc_add_block_to_block (&se->pre, &argse.pre);
2880 gfc_add_block_to_block (&se->post, &argse.post);
2881 arg1 = gfc_evaluate_now (argse.expr, &se->pre);
2883 /* Build the call to size0. */
2884 fncall0 = build_call_expr (gfor_fndecl_size0, 1, arg1);
2886 actual = actual->next;
2890 gfc_init_se (&argse, NULL);
2891 gfc_conv_expr_type (&argse, actual->expr,
2892 gfc_array_index_type);
2893 gfc_add_block_to_block (&se->pre, &argse.pre);
2895 /* Build the call to size1. */
2896 fncall1 = build_call_expr (gfor_fndecl_size1, 2,
2899 /* Unusually, for an intrinsic, size does not exclude
2900 an optional arg2, so we must test for it. */
2901 if (actual->expr->expr_type == EXPR_VARIABLE
2902 && actual->expr->symtree->n.sym->attr.dummy
2903 && actual->expr->symtree->n.sym->attr.optional)
2906 gfc_init_se (&argse, NULL);
2907 argse.want_pointer = 1;
2908 argse.data_not_needed = 1;
2909 gfc_conv_expr (&argse, actual->expr);
2910 gfc_add_block_to_block (&se->pre, &argse.pre);
2911 tmp = build2 (NE_EXPR, boolean_type_node, argse.expr,
2913 tmp = gfc_evaluate_now (tmp, &se->pre);
2914 se->expr = build3 (COND_EXPR, pvoid_type_node,
2915 tmp, fncall1, fncall0);
2923 type = gfc_typenode_for_spec (&expr->ts);
2924 se->expr = convert (type, se->expr);
2929 gfc_conv_intrinsic_sizeof (gfc_se *se, gfc_expr *expr)
2943 arg = expr->value.function.actual->expr;
2945 gfc_init_se (&argse, NULL);
2946 ss = gfc_walk_expr (arg);
2948 source_bytes = gfc_create_var (gfc_array_index_type, "bytes");
2950 if (ss == gfc_ss_terminator)
2952 gfc_conv_expr_reference (&argse, arg);
2953 source = argse.expr;
2955 type = TREE_TYPE (build_fold_indirect_ref (argse.expr));
2957 /* Obtain the source word length. */
2958 if (arg->ts.type == BT_CHARACTER)
2959 source_bytes = fold_convert (gfc_array_index_type,
2960 argse.string_length);
2962 source_bytes = fold_convert (gfc_array_index_type,
2963 size_in_bytes (type));
2967 argse.want_pointer = 0;
2968 gfc_conv_expr_descriptor (&argse, arg, ss);
2969 source = gfc_conv_descriptor_data_get (argse.expr);
2970 type = gfc_get_element_type (TREE_TYPE (argse.expr));
2972 /* Obtain the argument's word length. */
2973 if (arg->ts.type == BT_CHARACTER)
2974 tmp = fold_convert (gfc_array_index_type, argse.string_length);
2976 tmp = fold_convert (gfc_array_index_type,
2977 size_in_bytes (type));
2978 gfc_add_modify_expr (&argse.pre, source_bytes, tmp);
2980 /* Obtain the size of the array in bytes. */
2981 for (n = 0; n < arg->rank; n++)
2984 idx = gfc_rank_cst[n];
2985 lower = gfc_conv_descriptor_lbound (argse.expr, idx);
2986 upper = gfc_conv_descriptor_ubound (argse.expr, idx);
2987 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
2989 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
2990 tmp, gfc_index_one_node);
2991 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
2993 gfc_add_modify_expr (&argse.pre, source_bytes, tmp);
2997 gfc_add_block_to_block (&se->pre, &argse.pre);
2998 se->expr = source_bytes;
3002 /* Intrinsic string comparison functions. */
3005 gfc_conv_intrinsic_strcmp (gfc_se * se, gfc_expr * expr, int op)
3009 gfc_conv_intrinsic_function_args (se, expr, args, 4);
3011 se->expr = gfc_build_compare_string (args[0], args[1], args[2], args[3]);
3012 se->expr = fold_build2 (op, gfc_typenode_for_spec (&expr->ts), se->expr,
3013 build_int_cst (TREE_TYPE (se->expr), 0));
3016 /* Generate a call to the adjustl/adjustr library function. */
3018 gfc_conv_intrinsic_adjust (gfc_se * se, gfc_expr * expr, tree fndecl)
3026 gfc_conv_intrinsic_function_args (se, expr, &args[1], 2);
3029 type = TREE_TYPE (args[2]);
3030 var = gfc_conv_string_tmp (se, type, len);
3033 tmp = build_call_expr (fndecl, 3, args[0], args[1], args[2]);
3034 gfc_add_expr_to_block (&se->pre, tmp);
3036 se->string_length = len;
3040 /* Array transfer statement.
3041 DEST(1:N) = TRANSFER (SOURCE, MOLD[, SIZE])
3043 typeof<DEST> = typeof<MOLD>
3045 N = min (sizeof (SOURCE(:)), sizeof (DEST(:)),
3046 sizeof (DEST(0) * SIZE). */
3049 gfc_conv_intrinsic_array_transfer (gfc_se * se, gfc_expr * expr)
3064 gfc_actual_arglist *arg;
3071 gcc_assert (se->loop);
3072 info = &se->ss->data.info;
3074 /* Convert SOURCE. The output from this stage is:-
3075 source_bytes = length of the source in bytes
3076 source = pointer to the source data. */
3077 arg = expr->value.function.actual;
3078 gfc_init_se (&argse, NULL);
3079 ss = gfc_walk_expr (arg->expr);
3081 source_bytes = gfc_create_var (gfc_array_index_type, NULL);
3083 /* Obtain the pointer to source and the length of source in bytes. */
3084 if (ss == gfc_ss_terminator)
3086 gfc_conv_expr_reference (&argse, arg->expr);
3087 source = argse.expr;
3089 source_type = TREE_TYPE (build_fold_indirect_ref (argse.expr));
3091 /* Obtain the source word length. */
3092 if (arg->expr->ts.type == BT_CHARACTER)
3093 tmp = fold_convert (gfc_array_index_type, argse.string_length);
3095 tmp = fold_convert (gfc_array_index_type,
3096 size_in_bytes (source_type));
3100 argse.want_pointer = 0;
3101 gfc_conv_expr_descriptor (&argse, arg->expr, ss);
3102 source = gfc_conv_descriptor_data_get (argse.expr);
3103 source_type = gfc_get_element_type (TREE_TYPE (argse.expr));
3105 /* Repack the source if not a full variable array. */
3106 if (!(arg->expr->expr_type == EXPR_VARIABLE
3107 && arg->expr->ref->u.ar.type == AR_FULL))
3109 tmp = build_fold_addr_expr (argse.expr);
3110 source = build_call_expr (gfor_fndecl_in_pack, 1, tmp);
3111 source = gfc_evaluate_now (source, &argse.pre);
3113 /* Free the temporary. */
3114 gfc_start_block (&block);
3115 tmp = gfc_call_free (convert (pvoid_type_node, source));
3116 gfc_add_expr_to_block (&block, tmp);
3117 stmt = gfc_finish_block (&block);
3119 /* Clean up if it was repacked. */
3120 gfc_init_block (&block);
3121 tmp = gfc_conv_array_data (argse.expr);
3122 tmp = build2 (NE_EXPR, boolean_type_node, source, tmp);
3123 tmp = build3_v (COND_EXPR, tmp, stmt, build_empty_stmt ());
3124 gfc_add_expr_to_block (&block, tmp);
3125 gfc_add_block_to_block (&block, &se->post);
3126 gfc_init_block (&se->post);
3127 gfc_add_block_to_block (&se->post, &block);
3130 /* Obtain the source word length. */
3131 if (arg->expr->ts.type == BT_CHARACTER)
3132 tmp = fold_convert (gfc_array_index_type, argse.string_length);
3134 tmp = fold_convert (gfc_array_index_type,
3135 size_in_bytes (source_type));
3137 /* Obtain the size of the array in bytes. */
3138 extent = gfc_create_var (gfc_array_index_type, NULL);
3139 for (n = 0; n < arg->expr->rank; n++)
3142 idx = gfc_rank_cst[n];
3143 gfc_add_modify_expr (&argse.pre, source_bytes, tmp);
3144 stride = gfc_conv_descriptor_stride (argse.expr, idx);
3145 lower = gfc_conv_descriptor_lbound (argse.expr, idx);
3146 upper = gfc_conv_descriptor_ubound (argse.expr, idx);
3147 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3149 gfc_add_modify_expr (&argse.pre, extent, tmp);
3150 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
3151 extent, gfc_index_one_node);
3152 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
3157 gfc_add_modify_expr (&argse.pre, source_bytes, tmp);
3158 gfc_add_block_to_block (&se->pre, &argse.pre);
3159 gfc_add_block_to_block (&se->post, &argse.post);
3161 /* Now convert MOLD. The outputs are:
3162 mold_type = the TREE type of MOLD
3163 dest_word_len = destination word length in bytes. */
3166 gfc_init_se (&argse, NULL);
3167 ss = gfc_walk_expr (arg->expr);
3169 if (ss == gfc_ss_terminator)
3171 gfc_conv_expr_reference (&argse, arg->expr);
3172 mold_type = TREE_TYPE (build_fold_indirect_ref (argse.expr));
3176 gfc_init_se (&argse, NULL);
3177 argse.want_pointer = 0;
3178 gfc_conv_expr_descriptor (&argse, arg->expr, ss);
3179 mold_type = gfc_get_element_type (TREE_TYPE (argse.expr));
3182 if (arg->expr->ts.type == BT_CHARACTER)
3184 tmp = fold_convert (gfc_array_index_type, argse.string_length);
3185 mold_type = gfc_get_character_type_len (arg->expr->ts.kind, tmp);
3188 tmp = fold_convert (gfc_array_index_type,
3189 size_in_bytes (mold_type));
3191 dest_word_len = gfc_create_var (gfc_array_index_type, NULL);
3192 gfc_add_modify_expr (&se->pre, dest_word_len, tmp);
3194 /* Finally convert SIZE, if it is present. */
3196 size_words = gfc_create_var (gfc_array_index_type, NULL);
3200 gfc_init_se (&argse, NULL);
3201 gfc_conv_expr_reference (&argse, arg->expr);
3202 tmp = convert (gfc_array_index_type,
3203 build_fold_indirect_ref (argse.expr));
3204 gfc_add_block_to_block (&se->pre, &argse.pre);
3205 gfc_add_block_to_block (&se->post, &argse.post);
3210 size_bytes = gfc_create_var (gfc_array_index_type, NULL);
3211 if (tmp != NULL_TREE)
3213 tmp = fold_build2 (MULT_EXPR, gfc_array_index_type,
3214 tmp, dest_word_len);
3215 tmp = fold_build2 (MIN_EXPR, gfc_array_index_type,
3221 gfc_add_modify_expr (&se->pre, size_bytes, tmp);
3222 gfc_add_modify_expr (&se->pre, size_words,
3223 fold_build2 (CEIL_DIV_EXPR, gfc_array_index_type,
3224 size_bytes, dest_word_len));
3226 /* Evaluate the bounds of the result. If the loop range exists, we have
3227 to check if it is too large. If so, we modify loop->to be consistent
3228 with min(size, size(source)). Otherwise, size is made consistent with
3229 the loop range, so that the right number of bytes is transferred.*/
3230 n = se->loop->order[0];
3231 if (se->loop->to[n] != NULL_TREE)
3233 tmp = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3234 se->loop->to[n], se->loop->from[n]);
3235 tmp = fold_build2 (PLUS_EXPR, gfc_array_index_type,
3236 tmp, gfc_index_one_node);
3237 tmp = fold_build2 (MIN_EXPR, gfc_array_index_type,
3239 gfc_add_modify_expr (&se->pre, size_words, tmp);
3240 gfc_add_modify_expr (&se->pre, size_bytes,
3241 fold_build2 (MULT_EXPR, gfc_array_index_type,
3242 size_words, dest_word_len));
3243 upper = fold_build2 (PLUS_EXPR, gfc_array_index_type,
3244 size_words, se->loop->from[n]);
3245 upper = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3246 upper, gfc_index_one_node);
3250 upper = fold_build2 (MINUS_EXPR, gfc_array_index_type,
3251 size_words, gfc_index_one_node);
3252 se->loop->from[n] = gfc_index_zero_node;
3255 se->loop->to[n] = upper;
3257 /* Build a destination descriptor, using the pointer, source, as the
3258 data field. This is already allocated so set callee_alloc.
3259 FIXME callee_alloc is not set! */
3261 gfc_trans_create_temp_array (&se->pre, &se->post, se->loop,
3262 info, mold_type, false, true, false);
3264 /* Cast the pointer to the result. */
3265 tmp = gfc_conv_descriptor_data_get (info->descriptor);
3266 tmp = fold_convert (pvoid_type_node, tmp);
3268 /* Use memcpy to do the transfer. */
3269 tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY],
3272 fold_convert (pvoid_type_node, source),
3274 gfc_add_expr_to_block (&se->pre, tmp);
3276 se->expr = info->descriptor;
3277 if (expr->ts.type == BT_CHARACTER)
3278 se->string_length = dest_word_len;
3282 /* Scalar transfer statement.
3283 TRANSFER (source, mold) = memcpy(&tmpdecl, &source, size), tmpdecl. */
3286 gfc_conv_intrinsic_transfer (gfc_se * se, gfc_expr * expr)
3288 gfc_actual_arglist *arg;
3295 /* Get a pointer to the source. */
3296 arg = expr->value.function.actual;
3297 ss = gfc_walk_expr (arg->expr);
3298 gfc_init_se (&argse, NULL);
3299 if (ss == gfc_ss_terminator)
3300 gfc_conv_expr_reference (&argse, arg->expr);
3302 gfc_conv_array_parameter (&argse, arg->expr, ss, 1);
3303 gfc_add_block_to_block (&se->pre, &argse.pre);
3304 gfc_add_block_to_block (&se->post, &argse.post);
3308 type = gfc_typenode_for_spec (&expr->ts);
3310 if (expr->ts.type == BT_CHARACTER)
3312 ptr = convert (build_pointer_type (type), ptr);
3313 gfc_init_se (&argse, NULL);
3314 gfc_conv_expr (&argse, arg->expr);
3315 gfc_add_block_to_block (&se->pre, &argse.pre);
3316 gfc_add_block_to_block (&se->post, &argse.post);
3318 se->string_length = argse.string_length;
3323 tmpdecl = gfc_create_var (type, "transfer");
3324 moldsize = size_in_bytes (type);
3326 /* Use memcpy to do the transfer. */
3327 tmp = build1 (ADDR_EXPR, build_pointer_type (type), tmpdecl);
3328 tmp = build_call_expr (built_in_decls[BUILT_IN_MEMCPY], 3,
3329 fold_convert (pvoid_type_node, tmp),
3330 fold_convert (pvoid_type_node, ptr),
3332 gfc_add_expr_to_block (&se->pre, tmp);
3339 /* Generate code for the ALLOCATED intrinsic.
3340 Generate inline code that directly check the address of the argument. */
3343 gfc_conv_allocated (gfc_se *se, gfc_expr *expr)
3345 gfc_actual_arglist *arg1;
3350 gfc_init_se (&arg1se, NULL);
3351 arg1 = expr->value.function.actual;
3352 ss1 = gfc_walk_expr (arg1->expr);
3353 arg1se.descriptor_only = 1;
3354 gfc_conv_expr_descriptor (&arg1se, arg1->expr, ss1);
3356 tmp = gfc_conv_descriptor_data_get (arg1se.expr);
3357 tmp = build2 (NE_EXPR, boolean_type_node, tmp,
3358 fold_convert (TREE_TYPE (tmp), null_pointer_node));
3359 se->expr = convert (gfc_typenode_for_spec (&expr->ts), tmp);
3363 /* Generate code for the ASSOCIATED intrinsic.
3364 If both POINTER and TARGET are arrays, generate a call to library function
3365 _gfor_associated, and pass descriptors of POINTER and TARGET to it.
3366 In other cases, generate inline code that directly compare the address of
3367 POINTER with the address of TARGET. */
3370 gfc_conv_associated (gfc_se *se, gfc_expr *expr)
3372 gfc_actual_arglist *arg1;
3373 gfc_actual_arglist *arg2;
3378 tree nonzero_charlen;
3379 tree nonzero_arraylen;
3382 gfc_init_se (&arg1se, NULL);
3383 gfc_init_se (&arg2se, NULL);
3384 arg1 = expr->value.function.actual;
3386 ss1 = gfc_walk_expr (arg1->expr);
3390 /* No optional target. */
3391 if (ss1 == gfc_ss_terminator)
3393 /* A pointer to a scalar. */
3394 arg1se.want_pointer = 1;
3395 gfc_conv_expr (&arg1se, arg1->expr);
3400 /* A pointer to an array. */
3401 gfc_conv_expr_descriptor (&arg1se, arg1->expr, ss1);
3402 tmp2 = gfc_conv_descriptor_data_get (arg1se.expr);
3404 gfc_add_block_to_block (&se->pre, &arg1se.pre);
3405 gfc_add_block_to_block (&se->post, &arg1se.post);
3406 tmp = build2 (NE_EXPR, boolean_type_node, tmp2,
3407 fold_convert (TREE_TYPE (tmp2), null_pointer_node));
3412 /* An optional target. */
3413 ss2 = gfc_walk_expr (arg2->expr);
3415 nonzero_charlen = NULL_TREE;
3416 if (arg1->expr->ts.type == BT_CHARACTER)
3417 nonzero_charlen = build2 (NE_EXPR, boolean_type_node,
3418 arg1->expr->ts.cl->backend_decl,
3421 if (ss1 == gfc_ss_terminator)
3423 /* A pointer to a scalar. */
3424 gcc_assert (ss2 == gfc_ss_terminator);
3425 arg1se.want_pointer = 1;
3426 gfc_conv_expr (&arg1se, arg1->expr);
3427 arg2se.want_pointer = 1;
3428 gfc_conv_expr (&arg2se, arg2->expr);
3429 gfc_add_block_to_block (&se->pre, &arg1se.pre);
3430 gfc_add_block_to_block (&se->post, &arg1se.post);
3431 tmp = build2 (EQ_EXPR, boolean_type_node, arg1se.expr, arg2se.expr);
3432 tmp2 = build2 (NE_EXPR, boolean_type_node, arg1se.expr,
3434 se->expr = build2 (TRUTH_AND_EXPR, boolean_type_node, tmp, tmp2);
3438 /* An array pointer of zero length is not associated if target is
3440 arg1se.descriptor_only = 1;
3441 gfc_conv_expr_lhs (&arg1se, arg1->expr);
3442 tmp = gfc_conv_descriptor_stride (arg1se.expr,
3443 gfc_rank_cst[arg1->expr->rank - 1]);
3444 nonzero_arraylen = build2 (NE_EXPR, boolean_type_node,
3445 tmp, build_int_cst (TREE_TYPE (tmp), 0));
3447 /* A pointer to an array, call library function _gfor_associated. */
3448 gcc_assert (ss2 != gfc_ss_terminator);
3449 arg1se.want_pointer = 1;
3450 gfc_conv_expr_descriptor (&arg1se, arg1->expr, ss1);
3452 arg2se.want_pointer = 1;
3453 gfc_conv_expr_descriptor (&arg2se, arg2->expr, ss2);
3454 gfc_add_block_to_block (&se->pre, &arg2se.pre);
3455 gfc_add_block_to_block (&se->post, &arg2se.post);
3456 se->expr = build_call_expr (gfor_fndecl_associated, 2,
3457 arg1se.expr, arg2se.expr);
3458 se->expr = convert (boolean_type_node, se->expr);
3459 se->expr = build2 (TRUTH_AND_EXPR, boolean_type_node,
3460 se->expr, nonzero_arraylen);
3463 /* If target is present zero character length pointers cannot
3465 if (nonzero_charlen != NULL_TREE)
3466 se->expr = build2 (TRUTH_AND_EXPR, boolean_type_node,
3467 se->expr, nonzero_charlen);
3470 se->expr = convert (gfc_typenode_for_spec (&expr->ts), se->expr);
3474 /* Scan a string for any one of the characters in a set of characters. */
3477 gfc_conv_intrinsic_scan (gfc_se * se, gfc_expr * expr)
3479 tree logical4_type_node = gfc_get_logical_type (4);
3483 unsigned int num_args;
3485 num_args = gfc_intrinsic_argument_list_length (expr);
3486 args = alloca (sizeof (tree) * 5);
3488 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
3489 type = gfc_typenode_for_spec (&expr->ts);
3492 args[4] = build_int_cst (logical4_type_node, 0);
3495 gcc_assert (num_args == 5);
3496 args[4] = convert (logical4_type_node, args[4]);
3499 fndecl = build_addr (gfor_fndecl_string_scan, current_function_decl);
3500 se->expr = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_string_scan)),
3502 se->expr = convert (type, se->expr);
3506 /* Verify that a set of characters contains all the characters in a string
3507 by identifying the position of the first character in a string of
3508 characters that does not appear in a given set of characters. */
3511 gfc_conv_intrinsic_verify (gfc_se * se, gfc_expr * expr)
3513 tree logical4_type_node = gfc_get_logical_type (4);
3517 unsigned int num_args;
3519 num_args = gfc_intrinsic_argument_list_length (expr);
3520 args = alloca (sizeof (tree) * 5);
3522 gfc_conv_intrinsic_function_args (se, expr, args, num_args);
3523 type = gfc_typenode_for_spec (&expr->ts);
3526 args[4] = build_int_cst (logical4_type_node, 0);
3529 gcc_assert (num_args == 5);
3530 args[4] = convert (logical4_type_node, args[4]);
3533 fndecl = build_addr (gfor_fndecl_string_verify, current_function_decl);
3534 se->expr = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_string_verify)),
3537 se->expr = convert (type, se->expr);
3541 /* Generate code for SELECTED_INT_KIND (R) intrinsic function. */
3544 gfc_conv_intrinsic_si_kind (gfc_se *se, gfc_expr *expr)
3548 gfc_conv_intrinsic_function_args (se, expr, &arg, 1);
3550 /* The argument to SELECTED_INT_KIND is INTEGER(4). */
3551 type = gfc_get_int_type (4);
3552 arg = build_fold_addr_expr (fold_convert (type, arg));
3554 /* Convert it to the required type. */
3555 type = gfc_typenode_for_spec (&expr->ts);
3556 se->expr = build_call_expr (gfor_fndecl_si_kind, 1, arg);
3557 se->expr = fold_convert (type, se->expr);
3561 /* Generate code for SELECTED_REAL_KIND (P, R) intrinsic function. */
3564 gfc_conv_intrinsic_sr_kind (gfc_se *se, gfc_expr *expr)
3566 gfc_actual_arglist *actual;
3571 for (actual = expr->value.function.actual; actual; actual = actual->next)
3573 gfc_init_se (&argse, se);
3575 /* Pass a NULL pointer for an absent arg. */
3576 if (actual->expr == NULL)
3577 argse.expr = null_pointer_node;
3581 if (actual->expr->ts.kind != gfc_c_int_kind)
3583 /* The arguments to SELECTED_REAL_KIND are INTEGER(4). */
3584 ts.type = BT_INTEGER;
3585 ts.kind = gfc_c_int_kind;
3586 gfc_convert_type (actual->expr, &ts, 2);
3588 gfc_conv_expr_reference (&argse, actual->expr);
3591 gfc_add_block_to_block (&se->pre, &argse.pre);
3592 gfc_add_block_to_block (&se->post, &argse.post);
3593 args = gfc_chainon_list (args, argse.expr);
3596 /* Convert it to the required type. */
3597 type = gfc_typenode_for_spec (&expr->ts);
3598 se->expr = build_function_call_expr (gfor_fndecl_sr_kind, args);
3599 se->expr = fold_convert (type, se->expr);
3603 /* Generate code for TRIM (A) intrinsic function. */
3606 gfc_conv_intrinsic_trim (gfc_se * se, gfc_expr * expr)
3608 tree gfc_int4_type_node = gfc_get_int_type (4);
3617 unsigned int num_args;
3619 num_args = gfc_intrinsic_argument_list_length (expr) + 2;
3620 args = alloca (sizeof (tree) * num_args);
3622 type = build_pointer_type (gfc_character1_type_node);
3623 var = gfc_create_var (type, "pstr");
3624 addr = gfc_build_addr_expr (ppvoid_type_node, var);
3625 len = gfc_create_var (gfc_int4_type_node, "len");
3627 gfc_conv_intrinsic_function_args (se, expr, &args[2], num_args - 2);
3628 args[0] = build_fold_addr_expr (len);
3631 fndecl = build_addr (gfor_fndecl_string_trim, current_function_decl);
3632 tmp = build_call_array (TREE_TYPE (TREE_TYPE (gfor_fndecl_string_trim)),
3633 fndecl, num_args, args);
3634 gfc_add_expr_to_block (&se->pre, tmp);
3636 /* Free the temporary afterwards, if necessary. */
3637 cond = build2 (GT_EXPR, boolean_type_node, len,
3638 build_int_cst (TREE_TYPE (len), 0));
3639 tmp = gfc_call_free (var);
3640 tmp = build3_v (COND_EXPR, cond, tmp, build_empty_stmt ());
3641 gfc_add_expr_to_block (&se->post, tmp);
3644 se->string_length = len;
3648 /* Generate code for REPEAT (STRING, NCOPIES) intrinsic function. */
3651 gfc_conv_intrinsic_repeat (gfc_se * se, gfc_expr * expr)
3653 tree args[3], ncopies, dest, dlen, src, slen, ncopies_type;
3654 tree type, cond, tmp, count, exit_label, n, max, largest;
3655 stmtblock_t block, body;
3658 /* Get the arguments. */
3659 gfc_conv_intrinsic_function_args (se, expr, args, 3);
3660 slen = fold_convert (size_type_node, gfc_evaluate_now (args[0], &se->pre));
3662 ncopies = gfc_evaluate_now (args[2], &se->pre);
3663 ncopies_type = TREE_TYPE (ncopies);
3665 /* Check that NCOPIES is not negative. */
3666 cond = fold_build2 (LT_EXPR, boolean_type_node, ncopies,
3667 build_int_cst (ncopies_type, 0));
3668 gfc_trans_runtime_check (cond, &se->pre, &expr->where,
3669 "Argument NCOPIES of REPEAT intrinsic is negative "
3670 "(its value is %lld)",
3671 fold_convert (long_integer_type_node, ncopies));
3673 /* If the source length is zero, any non negative value of NCOPIES
3674 is valid, and nothing happens. */
3675 n = gfc_create_var (ncopies_type, "ncopies");
3676 cond = fold_build2 (EQ_EXPR, boolean_type_node, slen,
3677 build_int_cst (size_type_node, 0));
3678 tmp = fold_build3 (COND_EXPR, ncopies_type, cond,
3679 build_int_cst (ncopies_type, 0), ncopies);
3680 gfc_add_modify_expr (&se->pre, n, tmp);
3683 /* Check that ncopies is not too large: ncopies should be less than
3684 (or equal to) MAX / slen, where MAX is the maximal integer of
3685 the gfc_charlen_type_node type. If slen == 0, we need a special
3686 case to avoid the division by zero. */
3687 i = gfc_validate_kind (BT_INTEGER, gfc_charlen_int_kind, false);
3688 max = gfc_conv_mpz_to_tree (gfc_integer_kinds[i].huge, gfc_charlen_int_kind);
3689 max = fold_build2 (TRUNC_DIV_EXPR, size_type_node,
3690 fold_convert (size_type_node, max), slen);
3691 largest = TYPE_PRECISION (size_type_node) > TYPE_PRECISION (ncopies_type)
3692 ? size_type_node : ncopies_type;
3693 cond = fold_build2 (GT_EXPR, boolean_type_node,
3694 fold_convert (largest, ncopies),
3695 fold_convert (largest, max));
3696 tmp = fold_build2 (EQ_EXPR, boolean_type_node, slen,
3697 build_int_cst (size_type_node, 0));
3698 cond = fold_build3 (COND_EXPR, boolean_type_node, tmp, boolean_false_node,
3700 gfc_trans_runtime_check (cond, &se->pre, &expr->where,
3701 "Argument NCOPIES of REPEAT intrinsic is too large");
3704 /* Compute the destination length. */
3705 dlen = fold_build2 (MULT_EXPR, gfc_charlen_type_node,
3706 fold_convert (gfc_charlen_type_node, slen),
3707 fold_convert (gfc_charlen_type_node, ncopies));
3708 type = gfc_get_character_type (expr->ts.kind, expr->ts.cl);
3709 dest = gfc_conv_string_tmp (se, build_pointer_type (type), dlen);
3711 /* Generate the code to do the repeat operation:
3712 for (i = 0; i < ncopies; i++)
3713 memmove (dest + (i * slen), src, slen); */
3714 gfc_start_block (&block);
3715 count = gfc_create_var (ncopies_type, "count");
3716 gfc_add_modify_expr (&block, count, build_int_cst (ncopies_type, 0));
3717 exit_label = gfc_build_label_decl (NULL_TREE);
3719 /* Start the loop body. */
3720 gfc_start_block (&body);
3722 /* Exit the loop if count >= ncopies. */
3723 cond = fold_build2 (GE_EXPR, boolean_type_node, count, ncopies);
3724 tmp = build1_v (GOTO_EXPR, exit_label);
3725 TREE_USED (exit_label) = 1;
3726 tmp = fold_build3 (COND_EXPR, void_type_node, cond, tmp,
3727 build_empty_stmt ());
3728 gfc_add_expr_to_block (&body, tmp);
3730 /* Call memmove (dest + (i*slen), src, slen). */
3731 tmp = fold_build2 (MULT_EXPR, gfc_charlen_type_node,
3732 fold_convert (gfc_charlen_type_node, slen),
3733 fold_convert (gfc_charlen_type_node, count));
3734 tmp = fold_build2 (POINTER_PLUS_EXPR, pchar_type_node,
3735 fold_convert (pchar_type_node, dest),
3736 fold_convert (sizetype, tmp));
3737 tmp = build_call_expr (built_in_decls[BUILT_IN_MEMMOVE], 3,
3739 gfc_add_expr_to_block (&body, tmp);
3741 /* Increment count. */
3742 tmp = build2 (PLUS_EXPR, ncopies_type, count,
3743 build_int_cst (TREE_TYPE (count), 1));
3744 gfc_add_modify_expr (&body, count, tmp);
3746 /* Build the loop. */
3747 tmp = build1_v (LOOP_EXPR, gfc_finish_block (&body));
3748 gfc_add_expr_to_block (&block, tmp);
3750 /* Add the exit label. */
3751 tmp = build1_v (LABEL_EXPR, exit_label);
3752 gfc_add_expr_to_block (&block, tmp);
3754 /* Finish the block. */
3755 tmp = gfc_finish_block (&block);
3756 gfc_add_expr_to_block (&se->pre, tmp);
3758 /* Set the result value. */
3760 se->string_length = dlen;
3764 /* Generate code for the IARGC intrinsic. */
3767 gfc_conv_intrinsic_iargc (gfc_se * se, gfc_expr * expr)
3773 /* Call the library function. This always returns an INTEGER(4). */
3774 fndecl = gfor_fndecl_iargc;
3775 tmp = build_call_expr (fndecl, 0);
3777 /* Convert it to the required type. */
3778 type = gfc_typenode_for_spec (&expr->ts);
3779 tmp = fold_convert (type, tmp);
3785 /* The loc intrinsic returns the address of its argument as
3786 gfc_index_integer_kind integer. */
3789 gfc_conv_intrinsic_loc (gfc_se * se, gfc_expr * expr)
3795 gcc_assert (!se->ss);
3797 arg_expr = expr->value.function.actual->expr;
3798 ss = gfc_walk_expr (arg_expr);
3799 if (ss == gfc_ss_terminator)
3800 gfc_conv_expr_reference (se, arg_expr);
3802 gfc_conv_array_parameter (se, arg_expr, ss, 1);
3803 se->expr= convert (gfc_get_int_type (gfc_index_integer_kind), se->expr);
3805 /* Create a temporary variable for loc return value. Without this,
3806 we get an error an ICE in gcc/expr.c(expand_expr_addr_expr_1). */
3807 temp_var = gfc_create_var (gfc_get_int_type (gfc_index_integer_kind), NULL);
3808 gfc_add_modify_expr (&se->pre, temp_var, se->expr);
3809 se->expr = temp_var;
3812 /* Generate code for an intrinsic function. Some map directly to library
3813 calls, others get special handling. In some cases the name of the function
3814 used depends on the type specifiers. */
3817 gfc_conv_intrinsic_function (gfc_se * se, gfc_expr * expr)
3819 gfc_intrinsic_sym *isym;
3823 isym = expr->value.function.isym;
3825 name = &expr->value.function.name[2];
3827 if (expr->rank > 0 && !expr->inline_noncopying_intrinsic)
3829 lib = gfc_is_intrinsic_libcall (expr);
3833 se->ignore_optional = 1;
3834 gfc_conv_intrinsic_funcall (se, expr);
3839 switch (expr->value.function.isym->id)
3844 case GFC_ISYM_REPEAT:
3845 gfc_conv_intrinsic_repeat (se, expr);
3849 gfc_conv_intrinsic_trim (se, expr);
3852 case GFC_ISYM_SI_KIND:
3853 gfc_conv_intrinsic_si_kind (se, expr);
3856 case GFC_ISYM_SR_KIND:
3857 gfc_conv_intrinsic_sr_kind (se, expr);
3860 case GFC_ISYM_EXPONENT:
3861 gfc_conv_intrinsic_exponent (se, expr);
3865 gfc_conv_intrinsic_scan (se, expr);
3868 case GFC_ISYM_VERIFY:
3869 gfc_conv_intrinsic_verify (se, expr);
3872 case GFC_ISYM_ALLOCATED:
3873 gfc_conv_allocated (se, expr);
3876 case GFC_ISYM_ASSOCIATED:
3877 gfc_conv_associated(se, expr);
3881 gfc_conv_intrinsic_abs (se, expr);
3884 case GFC_ISYM_ADJUSTL:
3885 gfc_conv_intrinsic_adjust (se, expr, gfor_fndecl_adjustl);
3888 case GFC_ISYM_ADJUSTR:
3889 gfc_conv_intrinsic_adjust (se, expr, gfor_fndecl_adjustr);
3892 case GFC_ISYM_AIMAG:
3893 gfc_conv_intrinsic_imagpart (se, expr);
3897 gfc_conv_intrinsic_aint (se, expr, RND_TRUNC);
3901 gfc_conv_intrinsic_anyall (se, expr, EQ_EXPR);
3904 case GFC_ISYM_ANINT:
3905 gfc_conv_intrinsic_aint (se, expr, RND_ROUND);
3909 gfc_conv_intrinsic_bitop (se, expr, BIT_AND_EXPR);
3913 gfc_conv_intrinsic_anyall (se, expr, NE_EXPR);
3916 case GFC_ISYM_BTEST:
3917 gfc_conv_intrinsic_btest (se, expr);
3920 case GFC_ISYM_ACHAR:
3922 gfc_conv_intrinsic_char (se, expr);
3925 case GFC_ISYM_CONVERSION:
3927 case GFC_ISYM_LOGICAL:
3929 gfc_conv_intrinsic_conversion (se, expr);
3932 /* Integer conversions are handled separately to make sure we get the
3933 correct rounding mode. */
3938 gfc_conv_intrinsic_int (se, expr, RND_TRUNC);
3942 gfc_conv_intrinsic_int (se, expr, RND_ROUND);
3945 case GFC_ISYM_CEILING:
3946 gfc_conv_intrinsic_int (se, expr, RND_CEIL);
3949 case GFC_ISYM_FLOOR:
3950 gfc_conv_intrinsic_int (se, expr, RND_FLOOR);
3954 gfc_conv_intrinsic_mod (se, expr, 0);
3957 case GFC_ISYM_MODULO:
3958 gfc_conv_intrinsic_mod (se, expr, 1);
3961 case GFC_ISYM_CMPLX:
3962 gfc_conv_intrinsic_cmplx (se, expr, name[5] == '1');
3965 case GFC_ISYM_COMMAND_ARGUMENT_COUNT:
3966 gfc_conv_intrinsic_iargc (se, expr);
3969 case GFC_ISYM_COMPLEX:
3970 gfc_conv_intrinsic_cmplx (se, expr, 1);
3973 case GFC_ISYM_CONJG:
3974 gfc_conv_intrinsic_conjg (se, expr);
3977 case GFC_ISYM_COUNT:
3978 gfc_conv_intrinsic_count (se, expr);
3981 case GFC_ISYM_CTIME:
3982 gfc_conv_intrinsic_ctime (se, expr);
3986 gfc_conv_intrinsic_dim (se, expr);
3989 case GFC_ISYM_DOT_PRODUCT:
3990 gfc_conv_intrinsic_dot_product (se, expr);
3993 case GFC_ISYM_DPROD:
3994 gfc_conv_intrinsic_dprod (se, expr);
3997 case GFC_ISYM_FDATE:
3998 gfc_conv_intrinsic_fdate (se, expr);
4002 gfc_conv_intrinsic_bitop (se, expr, BIT_AND_EXPR);
4005 case GFC_ISYM_IBCLR:
4006 gfc_conv_intrinsic_singlebitop (se, expr, 0);
4009 case GFC_ISYM_IBITS:
4010 gfc_conv_intrinsic_ibits (se, expr);
4013 case GFC_ISYM_IBSET:
4014 gfc_conv_intrinsic_singlebitop (se, expr, 1);
4017 case GFC_ISYM_IACHAR:
4018 case GFC_ISYM_ICHAR:
4019 /* We assume ASCII character sequence. */
4020 gfc_conv_intrinsic_ichar (se, expr);
4023 case GFC_ISYM_IARGC:
4024 gfc_conv_intrinsic_iargc (se, expr);
4028 gfc_conv_intrinsic_bitop (se, expr, BIT_XOR_EXPR);
4031 case GFC_ISYM_INDEX:
4032 gfc_conv_intrinsic_index (se, expr);
4036 gfc_conv_intrinsic_bitop (se, expr, BIT_IOR_EXPR);
4039 case GFC_ISYM_ISNAN:
4040 gfc_conv_intrinsic_isnan (se, expr);
4043 case GFC_ISYM_LSHIFT:
4044 gfc_conv_intrinsic_rlshift (se, expr, 0);
4047 case GFC_ISYM_RSHIFT:
4048 gfc_conv_intrinsic_rlshift (se, expr, 1);
4051 case GFC_ISYM_ISHFT:
4052 gfc_conv_intrinsic_ishft (se, expr);
4055 case GFC_ISYM_ISHFTC:
4056 gfc_conv_intrinsic_ishftc (se, expr);
4059 case GFC_ISYM_LBOUND:
4060 gfc_conv_intrinsic_bound (se, expr, 0);
4063 case GFC_ISYM_TRANSPOSE:
4064 if (se->ss && se->ss->useflags)
4066 gfc_conv_tmp_array_ref (se);
4067 gfc_advance_se_ss_chain (se);
4070 gfc_conv_array_transpose (se, expr->value.function.actual->expr);
4074 gfc_conv_intrinsic_len (se, expr);
4077 case GFC_ISYM_LEN_TRIM:
4078 gfc_conv_intrinsic_len_trim (se, expr);
4082 gfc_conv_intrinsic_strcmp (se, expr, GE_EXPR);
4086 gfc_conv_intrinsic_strcmp (se, expr, GT_EXPR);
4090 gfc_conv_intrinsic_strcmp (se, expr, LE_EXPR);
4094 gfc_conv_intrinsic_strcmp (se, expr, LT_EXPR);
4098 if (expr->ts.type == BT_CHARACTER)
4099 gfc_conv_intrinsic_minmax_char (se, expr, 1);
4101 gfc_conv_intrinsic_minmax (se, expr, GT_EXPR);
4104 case GFC_ISYM_MAXLOC:
4105 gfc_conv_intrinsic_minmaxloc (se, expr, GT_EXPR);
4108 case GFC_ISYM_MAXVAL:
4109 gfc_conv_intrinsic_minmaxval (se, expr, GT_EXPR);
4112 case GFC_ISYM_MERGE:
4113 gfc_conv_intrinsic_merge (se, expr);
4117 if (expr->ts.type == BT_CHARACTER)
4118 gfc_conv_intrinsic_minmax_char (se, expr, -1);
4120 gfc_conv_intrinsic_minmax (se, expr, LT_EXPR);
4123 case GFC_ISYM_MINLOC:
4124 gfc_conv_intrinsic_minmaxloc (se, expr, LT_EXPR);
4127 case GFC_ISYM_MINVAL:
4128 gfc_conv_intrinsic_minmaxval (se, expr, LT_EXPR);
4132 gfc_conv_intrinsic_not (se, expr);
4136 gfc_conv_intrinsic_bitop (se, expr, BIT_IOR_EXPR);
4139 case GFC_ISYM_PRESENT:
4140 gfc_conv_intrinsic_present (se, expr);
4143 case GFC_ISYM_PRODUCT:
4144 gfc_conv_intrinsic_arith (se, expr, MULT_EXPR);
4148 gfc_conv_intrinsic_sign (se, expr);
4152 gfc_conv_intrinsic_size (se, expr);
4155 case GFC_ISYM_SIZEOF:
4156 gfc_conv_intrinsic_sizeof (se, expr);
4160 gfc_conv_intrinsic_arith (se, expr, PLUS_EXPR);
4163 case GFC_ISYM_TRANSFER:
4166 if (se->ss->useflags)
4168 /* Access the previously obtained result. */
4169 gfc_conv_tmp_array_ref (se);
4170 gfc_advance_se_ss_chain (se);
4174 gfc_conv_intrinsic_array_transfer (se, expr);
4177 gfc_conv_intrinsic_transfer (se, expr);
4180 case GFC_ISYM_TTYNAM:
4181 gfc_conv_intrinsic_ttynam (se, expr);
4184 case GFC_ISYM_UBOUND:
4185 gfc_conv_intrinsic_bound (se, expr, 1);
4189 gfc_conv_intrinsic_bitop (se, expr, BIT_XOR_EXPR);
4193 gfc_conv_intrinsic_loc (se, expr);
4196 case GFC_ISYM_ACCESS:
4197 case GFC_ISYM_CHDIR:
4198 case GFC_ISYM_CHMOD:
4199 case GFC_ISYM_ETIME:
4201 case GFC_ISYM_FGETC:
4204 case GFC_ISYM_FPUTC:
4205 case GFC_ISYM_FSTAT:
4206 case GFC_ISYM_FTELL:
4207 case GFC_ISYM_GETCWD:
4208 case GFC_ISYM_GETGID:
4209 case GFC_ISYM_GETPID:
4210 case GFC_ISYM_GETUID:
4211 case GFC_ISYM_HOSTNM:
4213 case GFC_ISYM_IERRNO:
4214 case GFC_ISYM_IRAND:
4215 case GFC_ISYM_ISATTY:
4217 case GFC_ISYM_LSTAT:
4218 case GFC_ISYM_MALLOC:
4219 case GFC_ISYM_MATMUL:
4220 case GFC_ISYM_MCLOCK:
4221 case GFC_ISYM_MCLOCK8:
4223 case GFC_ISYM_RENAME:
4224 case GFC_ISYM_SECOND:
4225 case GFC_ISYM_SECNDS:
4226 case GFC_ISYM_SIGNAL:
4228 case GFC_ISYM_SYMLNK:
4229 case GFC_ISYM_SYSTEM:
4231 case GFC_ISYM_TIME8:
4232 case GFC_ISYM_UMASK:
4233 case GFC_ISYM_UNLINK:
4234 gfc_conv_intrinsic_funcall (se, expr);
4238 gfc_conv_intrinsic_lib_function (se, expr);
4244 /* This generates code to execute before entering the scalarization loop.
4245 Currently does nothing. */
4248 gfc_add_intrinsic_ss_code (gfc_loopinfo * loop ATTRIBUTE_UNUSED, gfc_ss * ss)
4250 switch (ss->expr->value.function.isym->id)
4252 case GFC_ISYM_UBOUND:
4253 case GFC_ISYM_LBOUND:
4262 /* UBOUND and LBOUND intrinsics with one parameter are expanded into code
4263 inside the scalarization loop. */
4266 gfc_walk_intrinsic_bound (gfc_ss * ss, gfc_expr * expr)
4270 /* The two argument version returns a scalar. */
4271 if (expr->value.function.actual->next->expr)
4274 newss = gfc_get_ss ();
4275 newss->type = GFC_SS_INTRINSIC;
4278 newss->data.info.dimen = 1;
4284 /* Walk an intrinsic array libcall. */
4287 gfc_walk_intrinsic_libfunc (gfc_ss * ss, gfc_expr * expr)
4291 gcc_assert (expr->rank > 0);
4293 newss = gfc_get_ss ();
4294 newss->type = GFC_SS_FUNCTION;
4297 newss->data.info.dimen = expr->rank;
4303 /* Returns nonzero if the specified intrinsic function call maps directly to a
4304 an external library call. Should only be used for functions that return
4308 gfc_is_intrinsic_libcall (gfc_expr * expr)
4310 gcc_assert (expr->expr_type == EXPR_FUNCTION && expr->value.function.isym);
4311 gcc_assert (expr->rank > 0);
4313 switch (expr->value.function.isym->id)
4317 case GFC_ISYM_COUNT:
4318 case GFC_ISYM_MATMUL:
4319 case GFC_ISYM_MAXLOC:
4320 case GFC_ISYM_MAXVAL:
4321 case GFC_ISYM_MINLOC:
4322 case GFC_ISYM_MINVAL:
4323 case GFC_ISYM_PRODUCT:
4325 case GFC_ISYM_SHAPE:
4326 case GFC_ISYM_SPREAD:
4327 case GFC_ISYM_TRANSPOSE:
4328 /* Ignore absent optional parameters. */
4331 case GFC_ISYM_RESHAPE:
4332 case GFC_ISYM_CSHIFT:
4333 case GFC_ISYM_EOSHIFT:
4335 case GFC_ISYM_UNPACK:
4336 /* Pass absent optional parameters. */
4344 /* Walk an intrinsic function. */
4346 gfc_walk_intrinsic_function (gfc_ss * ss, gfc_expr * expr,
4347 gfc_intrinsic_sym * isym)
4351 if (isym->elemental)
4352 return gfc_walk_elemental_function_args (ss, expr->value.function.actual, GFC_SS_SCALAR);
4354 if (expr->rank == 0)
4357 if (gfc_is_intrinsic_libcall (expr))
4358 return gfc_walk_intrinsic_libfunc (ss, expr);
4360 /* Special cases. */
4363 case GFC_ISYM_LBOUND:
4364 case GFC_ISYM_UBOUND:
4365 return gfc_walk_intrinsic_bound (ss, expr);
4367 case GFC_ISYM_TRANSFER:
4368 return gfc_walk_intrinsic_libfunc (ss, expr);
4371 /* This probably meant someone forgot to add an intrinsic to the above
4372 list(s) when they implemented it, or something's gone horribly wrong.
4374 gfc_todo_error ("Scalarization of non-elemental intrinsic: %s",
4375 expr->value.function.name);
4379 #include "gt-fortran-trans-intrinsic.h"