intrinsic.c

     1  //! @file intrinsic.c
     2  //! @author J. Marcel van der Veer
     3  //
     4  //! @section Copyright
     5  //
     6  // This file is part of VIF - vintage FORTRAN compiler.
     7  // Copyright 2020-2025 J. Marcel van der Veer <algol68g@xs4all.nl>.
     8  //
     9  //! @section License
    10  //
    11  // This program is free software; you can redistribute it and/or modify it 
    12  // under the terms of the GNU General Public License as published by the 
    13  // Free Software Foundation; either version 3 of the License, or 
    14  // (at your option) any later version.
    15  //
    16  // This program is distributed in the hope that it will be useful, but 
    17  // WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY 
    18  // or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 
    19  // more details. You should have received a copy of the GNU General Public 
    20  // License along with this program. If not, see <http://www.gnu.org/licenses/>.
    21  
    22  //! @section Synopsis
    23  //!
    24  //! Compile inline intrinsic functions.
    25  
    26  #include <vif.h>
    27  
    28  // VIF intrinsic function definitions.
    29  
    30  #define INTR(_ffun, _spec, _bfun, _cfun, _rtyp, _rlen, _anum, _atyp, _alen, _f1, _f2, _f3) \
    31    {.ffun = (_ffun), .spec = (_spec), .bfun = _bfun, .cfun = (_cfun), .rtyp = (_rtyp), \
    32     .rlen = (_rlen), .anum = (_anum), .atyp = (_atyp), .alen = (_alen), \
    33     .f1 = (_f1), .f2 = (_f2), .f3 = (_f3)}
    34  
    35  static INTRINS fun[] = {
    36  // CHARACTER
    37    INTR ("achar", FALSE, NO_TEXT, "_char", CHARACTER, 1, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    38    INTR ("iachar", FALSE, NO_TEXT, "_ichar", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
    39    INTR ("char", FALSE, NO_TEXT, "_char", CHARACTER, 1, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    40    INTR ("ichar", FALSE, NO_TEXT, "_ichar", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
    41    INTR ("len", TRUE, NO_TEXT, "(int_4) strlen", INTEGER, 4, 1, CHARACTER, 0, NO_FUN, NO_FUN, NO_FUN),
    42  // INTEGER generic
    43    INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    44    INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    45    INTR ("abs", FALSE, NO_TEXT, "_abs", INTEGER, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    46    INTR ("amax0", FALSE, "(real_4)", "_max", REAL, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    47    INTR ("amin0", FALSE, "(real_4)", "_min", REAL, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    48    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    49    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    50    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    51    INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    52    INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    53    INTR ("dfloat", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    54    INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    55    INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    56    INTR ("dim", FALSE, NO_TEXT, "_dim_", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    57    INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    58    INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    59    INTR ("float", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN), 
    60    INTR ("idnint", FALSE, NO_TEXT, "_nintd", INTEGER, 4, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
    61    INTR ("int", FALSE, "(int_4)", "_aintd", INTEGER, 4, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
    62    INTR ("int", FALSE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
    63    INTR ("int", FALSE, "(int_4)", "_aintq", INTEGER, 4, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
    64    INTR ("int", FALSE, NO_TEXT, "", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    65    INTR ("int", FALSE, NO_TEXT, "", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    66    INTR ("int", FALSE, NO_TEXT, "", INTEGER, 8, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    67    INTR ("int", FALSE, NO_TEXT, "_xint4", INTEGER, 4, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
    68    INTR ("max0", FALSE, NO_TEXT, "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    69    INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    70    INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    71    INTR ("max", FALSE, NO_TEXT, "_max", INTEGER, 8, 0, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    72    INTR ("min0", FALSE, NO_TEXT, "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    73    INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    74    INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    75    INTR ("min", FALSE, NO_TEXT, "_min", INTEGER, 8, 0, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    76    INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    77    INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    78    INTR ("mod", FALSE, NO_TEXT, "_imod", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    79    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
    80    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
    81    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    82    INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    83    INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    84    INTR ("qfloat", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    85    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
    86    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
    87    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    88    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 2, _xI, NO_FUN, NO_FUN),
    89    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
    90    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    91    INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    92    INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    93    INTR ("sign", FALSE, NO_TEXT, "_sign", INTEGER, 8, 2, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    94    INTR ("xext", FALSE, "inttox", "(int_4)", REAL, 32, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    95    INTR ("xext", FALSE, NO_TEXT, "inttox", REAL, 32, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    96    INTR ("xext", FALSE, "quadtox", "(real_16)", REAL, 32, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
    97    INTR ("xfloat", FALSE, "inttox", "(int_4)", REAL, 32, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
    98    INTR ("xfloat", FALSE, NO_TEXT, "inttox", REAL, 32, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
    99    INTR ("xfloat", FALSE, "quadtox", "(real_16)", REAL, 32, 1, INTEGER, 8, NO_FUN, NO_FUN, NO_FUN),
   100  // INTEGER specific
   101    INTR ("dfloat", TRUE, NO_TEXT, "(real_8)", REAL, 8, 1, INTEGER, 4, _xI, NO_FUN, NO_FUN),
   102    INTR ("habs", TRUE, "(int_2)", "_abs", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   103    INTR ("hdim", TRUE, "(int_2)", "_dim_", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   104    INTR ("hdint", TRUE, "(int_2)", "_aintf", INTEGER, 2, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
   105    INTR ("hfix", TRUE, "(int_2)", "_aintf", INTEGER, 2, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
   106    INTR ("hint", TRUE, NO_TEXT, "(int_2)", INTEGER, 2, 1, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   107    INTR ("hmax", TRUE, "(int_2)", "_max", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   108    INTR ("hmin", TRUE, "(int_2)", "_min", INTEGER, 2, 0, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   109    INTR ("hmod", TRUE, "(int_2)", "_mod", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   110    INTR ("hsign", TRUE, "(int_2)", "_sign", INTEGER, 2, 2, INTEGER, 2, NO_FUN, NO_FUN, NO_FUN),
   111    INTR ("iabs", TRUE, "(int_4)", "_abs", INTEGER, 4, 1, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   112    INTR ("idim", TRUE, "(int_4)", "_dim_", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   113    INTR ("idint", TRUE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
   114    INTR ("ifix", TRUE, "(int_4)", "_aintf", INTEGER, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
   115    INTR ("imax", TRUE, "(int_4)", "_max", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   116    INTR ("imin", TRUE, "(int_4)", "_min", INTEGER, 4, 0, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   117    INTR ("imod", TRUE, "(int_4)", "_mod", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   118    INTR ("iqint", TRUE, "(int_4)", "_aintq", INTEGER, 4, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
   119    INTR ("isign", TRUE, "(int_4)", "_sign", INTEGER, 4, 2, INTEGER, 4, NO_FUN, NO_FUN, NO_FUN),
   120    INTR ("ixint", TRUE, NO_TEXT, "_xint4", INTEGER, 4, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
   121    INTR ("max1", TRUE, "(int_4)", "_max", INTEGER, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   122    INTR ("min1", TRUE, "(int_4)", "_min", INTEGER, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   123  // REAL generic
   124    INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 4, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   125    INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   126    INTR ("abs", FALSE, NO_TEXT, "_abs", REAL, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   127    INTR ("abs", FALSE, NO_TEXT, "xabs", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   128    INTR ("acos", FALSE, NO_TEXT, "acosf", REAL, 4, 1, REAL, 4, xacos, NO_FUN, NO_FUN),
   129    INTR ("acos", FALSE, NO_TEXT, "acos", REAL, 8, 1, REAL, 8, xacos, NO_FUN, NO_FUN),
   130    INTR ("acos", FALSE, NO_TEXT, "acosq", REAL, 16, 1, REAL, 16, xacos, NO_FUN, NO_FUN),
   131    INTR ("acos", FALSE, NO_TEXT, "xacos", REAL, 32, 1, REAL, 32, xacos, NO_FUN, NO_FUN),
   132    INTR ("acosh", FALSE, NO_TEXT, "acoshf", REAL, 4, 1, REAL, 4, xacosh, NO_FUN, NO_FUN),
   133    INTR ("acosh", FALSE, NO_TEXT, "acosh", REAL, 8, 1, REAL, 8, xacosh, NO_FUN, NO_FUN),
   134    INTR ("acosh", FALSE, NO_TEXT, "acoshq", REAL, 16, 1, REAL, 16, xacosh, NO_FUN, NO_FUN),
   135    INTR ("acosh", FALSE, NO_TEXT, "xacosh", REAL, 32, 1, REAL, 32, xacosh, NO_FUN, NO_FUN),
   136    INTR ("acotan", FALSE, NO_TEXT, "acotanf", REAL, 4, 1, REAL, 4, xacotan, NO_FUN, NO_FUN),
   137    INTR ("acotan", FALSE, NO_TEXT, "acotan", REAL, 8, 1, REAL, 8, xacotan, NO_FUN, NO_FUN),
   138    INTR ("acotan", FALSE, NO_TEXT, "acotanq", REAL, 16, 1, REAL, 16, xacotan, NO_FUN, NO_FUN),
   139    INTR ("acotan", FALSE, NO_TEXT, "xacotan", REAL, 32, 1, REAL, 32, xacotan, NO_FUN, NO_FUN),
   140    INTR ("aint", FALSE, NO_TEXT, "_aintd", REAL, 8, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
   141    INTR ("aint", FALSE, NO_TEXT, "_aintf", REAL, 4, 1, REAL, 4, _aintx, NO_FUN, NO_FUN),
   142    INTR ("aint", FALSE, NO_TEXT, "_aintd", REAL, 16, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
   143    INTR ("aint", FALSE, NO_TEXT, "_aintx", REAL, 32, 1, REAL, 32, _aintx, NO_FUN, NO_FUN),
   144    INTR ("anint", FALSE, NO_TEXT, "_anintd", REAL, 8, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
   145    INTR ("anint", FALSE, NO_TEXT, "_anintf", REAL, 4, 1, REAL, 4, _anintx, NO_FUN, NO_FUN),
   146    INTR ("anint", FALSE, NO_TEXT, "_anintq", REAL, 16, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
   147    INTR ("anint", FALSE, NO_TEXT, "_anintx", REAL, 32, 1, REAL, 32, _anintx, NO_FUN, NO_FUN),
   148    INTR ("asin", FALSE, NO_TEXT, "asinf", REAL, 4, 1, REAL, 4, xasin, NO_FUN, NO_FUN),
   149    INTR ("asin", FALSE, NO_TEXT, "asin", REAL, 8, 1, REAL, 8, xasin, NO_FUN, NO_FUN),
   150    INTR ("asin", FALSE, NO_TEXT, "asinq", REAL, 16, 1, REAL, 16, xasin, NO_FUN, NO_FUN),
   151    INTR ("asin", FALSE, NO_TEXT, "xasin", REAL, 32, 1, REAL, 32, xasin, NO_FUN, NO_FUN),
   152    INTR ("asinh", FALSE, NO_TEXT, "asinhf", REAL, 4, 1, REAL, 4, xasinh, NO_FUN, NO_FUN),
   153    INTR ("asinh", FALSE, NO_TEXT, "asinh", REAL, 8, 1, REAL, 8, xasinh, NO_FUN, NO_FUN),
   154    INTR ("asinh", FALSE, NO_TEXT, "asinhq", REAL, 16, 1, REAL, 16, xasinh, NO_FUN, NO_FUN),
   155    INTR ("asinh", FALSE, NO_TEXT, "xasinh", REAL, 32, 1, REAL, 32, xasinh, NO_FUN, NO_FUN),
   156    INTR ("atan2", FALSE, NO_TEXT, "atan2f", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   157    INTR ("atan2", FALSE, NO_TEXT, "atan2", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   158    INTR ("atan2", FALSE, NO_TEXT, "atan2q", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   159    INTR ("atan2", FALSE, NO_TEXT, "xatan2", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   160    INTR ("atan", FALSE, NO_TEXT, "atanf", REAL, 4, 1, REAL, 4, xatan, NO_FUN, NO_FUN),
   161    INTR ("atan", FALSE, NO_TEXT, "atan", REAL, 8, 1, REAL, 8, xatan, NO_FUN, NO_FUN),
   162    INTR ("atan", FALSE, NO_TEXT, "atanq", REAL, 16, 1, REAL, 16, xatan, NO_FUN, NO_FUN),
   163    INTR ("atan", FALSE, NO_TEXT, "xatan", REAL, 32, 1, REAL, 32, xatan, NO_FUN, NO_FUN),
   164    INTR ("atanh", FALSE, NO_TEXT, "atanhf", REAL, 4, 1, REAL, 4, xatanh, NO_FUN, NO_FUN),
   165    INTR ("atanh", FALSE, NO_TEXT, "atanh", REAL, 8, 1, REAL, 8, xatanh, NO_FUN, NO_FUN),
   166    INTR ("atanh", FALSE, NO_TEXT, "atanhq", REAL, 16, 1, REAL, 16, xatanh, NO_FUN, NO_FUN),
   167    INTR ("atanh", FALSE, NO_TEXT, "xatanh", REAL, 32, 1, REAL, 32, xatanh, NO_FUN, NO_FUN),
   168    INTR ("cos", FALSE, NO_TEXT, "cosf", REAL, 4, 1, REAL, 4, xcos, NO_FUN, NO_FUN),
   169    INTR ("cos", FALSE, NO_TEXT, "cos", REAL, 8, 1, REAL, 8, xcos, NO_FUN, NO_FUN),
   170    INTR ("cos", FALSE, NO_TEXT, "cosq", REAL, 16, 1, REAL, 16, xcos, NO_FUN, NO_FUN),
   171    INTR ("cos", FALSE, NO_TEXT, "xcos", REAL, 32, 1, REAL, 32, xcos, NO_FUN, NO_FUN),
   172    INTR ("cosh", FALSE, NO_TEXT, "coshf", REAL, 4, 1, REAL, 4, xcosh, NO_FUN, NO_FUN),
   173    INTR ("cosh", FALSE, NO_TEXT, "cosh", REAL, 8, 1, REAL, 8, xcosh, NO_FUN, NO_FUN),
   174    INTR ("cosh", FALSE, NO_TEXT, "coshq", REAL, 16, 1, REAL, 16, xcosh, NO_FUN, NO_FUN),
   175    INTR ("cosh", FALSE, NO_TEXT, "xcosh", REAL, 32, 1, REAL, 32, xcosh, NO_FUN, NO_FUN),
   176    INTR ("cotan", FALSE, NO_TEXT, "cotanf", REAL, 4, 1, REAL, 4, xcotan, NO_FUN, NO_FUN),
   177    INTR ("cotan", FALSE, NO_TEXT, "cotan", REAL, 8, 1, REAL, 8, xcotan, NO_FUN, NO_FUN),
   178    INTR ("cotan", FALSE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xcotan, NO_FUN, NO_FUN),
   179    INTR ("cotan", FALSE, NO_TEXT, "xcotan", REAL, 32, 1, REAL, 32, xcotan, NO_FUN, NO_FUN),
   180    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
   181    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
   182    INTR ("dble", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
   183    INTR ("dble", FALSE, NO_TEXT, "xtodbl", REAL, 8, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   184    INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   185    INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   186    INTR ("dim", FALSE, NO_TEXT, "_dim_", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   187    INTR ("dim", FALSE, NO_TEXT, "_xdimx", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   188    INTR ("exp", FALSE, NO_TEXT, "expf", REAL, 4, 1, REAL, 4, xexp, NO_FUN, NO_FUN),
   189    INTR ("exp", FALSE, NO_TEXT, "exp", REAL, 8, 1, REAL, 8, xexp, NO_FUN, NO_FUN),
   190    INTR ("exp", FALSE, NO_TEXT, "expq", REAL, 16, 1, REAL, 16, xexp, NO_FUN, NO_FUN),
   191    INTR ("exp", FALSE, NO_TEXT, "xexp", REAL, 32, 1, REAL, 32, xexp, NO_FUN, NO_FUN),
   192    INTR ("log10", FALSE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
   193    INTR ("log10", FALSE, NO_TEXT, "log10", REAL, 8, 1, REAL, 8, xlog10, NO_FUN, NO_FUN),
   194    INTR ("log10", FALSE, NO_TEXT, "log10q", REAL, 16, 1, REAL, 16, xlog10, NO_FUN, NO_FUN),
   195    INTR ("log10", FALSE, NO_TEXT, "xlog10", REAL, 32, 1, REAL, 32, xlog10, NO_FUN, NO_FUN),
   196    INTR ("log", FALSE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
   197    INTR ("log", FALSE, NO_TEXT, "log", REAL, 8, 1, REAL, 8, xlog, NO_FUN, NO_FUN),
   198    INTR ("log", FALSE, NO_TEXT, "logq", REAL, 16, 1, REAL, 16, xlog, NO_FUN, NO_FUN),
   199    INTR ("log", FALSE, NO_TEXT, "xlog", REAL, 32, 1, REAL, 32, xlog, NO_FUN, NO_FUN),
   200    INTR ("max", FALSE, NO_TEXT, "_max", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   201    INTR ("max", FALSE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   202    INTR ("max", FALSE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   203    INTR ("max", FALSE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   204    INTR ("min", FALSE, NO_TEXT, "_min", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   205    INTR ("min", FALSE, NO_TEXT, "_min", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   206    INTR ("min", FALSE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   207    INTR ("min", FALSE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   208    INTR ("mod", FALSE, NO_TEXT, "fmodf", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   209    INTR ("mod", FALSE, NO_TEXT, "fmod", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   210    INTR ("mod", FALSE, NO_TEXT, "fmodq", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   211    INTR ("mod", FALSE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   212    INTR ("nint", FALSE, NO_TEXT, "_nintf", INTEGER, 4, 1, REAL, 4, _anintx, NO_FUN, NO_FUN),
   213    INTR ("nint", FALSE, NO_TEXT, "_nintd", INTEGER, 4, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
   214    INTR ("nint", FALSE, NO_TEXT, "_nintq", INTEGER, 4, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
   215    INTR ("nint", FALSE, NO_TEXT, "_xnint4", INTEGER, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   216    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
   217    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
   218    INTR ("qext", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
   219    INTR ("qext", FALSE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   220    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
   221    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
   222    INTR ("qreal", FALSE, NO_TEXT, "(real_16)", REAL, 16, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
   223    INTR ("qreal", FALSE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   224    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   225    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   226    INTR ("real", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   227    INTR ("real", FALSE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   228    INTR ("sngl", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   229    INTR ("snglq", FALSE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   230    INTR ("snglx", FALSE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   231    INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   232    INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   233    INTR ("sign", FALSE, NO_TEXT, "_sign", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   234    INTR ("sign", FALSE, NO_TEXT, "_xsgn", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   235    INTR ("sin", FALSE, NO_TEXT, "sinf", REAL, 4, 1, REAL, 4, xsin, NO_FUN, NO_FUN),
   236    INTR ("sin", FALSE, NO_TEXT, "sin", REAL, 8, 1, REAL, 8, xsin, NO_FUN, NO_FUN),
   237    INTR ("sin", FALSE, NO_TEXT, "sinq", REAL, 16, 1, REAL, 16, xsin, NO_FUN, NO_FUN),
   238    INTR ("sin", FALSE, NO_TEXT, "xsin", REAL, 32, 1, REAL, 32, xsin, NO_FUN, NO_FUN),
   239    INTR ("sinh", FALSE, NO_TEXT, "sinhf", REAL, 4, 1, REAL, 4, xsinh, NO_FUN, NO_FUN),
   240    INTR ("sinh", FALSE, NO_TEXT, "sinh", REAL, 8, 1, REAL, 8, xsinh, NO_FUN, NO_FUN),
   241    INTR ("sinh", FALSE, NO_TEXT, "sinhq", REAL, 16, 1, REAL, 16, xsinh, NO_FUN, NO_FUN),
   242    INTR ("sinh", FALSE, NO_TEXT, "xsinh", REAL, 32, 1, REAL, 32, xsinh, NO_FUN, NO_FUN),
   243    INTR ("sqrt", FALSE, NO_TEXT, "sqrtf", REAL, 4, 1, REAL, 4, xsqrt, NO_FUN, NO_FUN),
   244    INTR ("sqrt", FALSE, NO_TEXT, "sqrt", REAL, 8, 1, REAL, 8, xsqrt, NO_FUN, NO_FUN),
   245    INTR ("sqrt", FALSE, NO_TEXT, "sqrtq", REAL, 16, 1, REAL, 16, xsqrt, NO_FUN, NO_FUN),
   246    INTR ("sqrt", FALSE, NO_TEXT, "xsqrt", REAL, 32, 1, REAL, 32, xsqrt, NO_FUN, NO_FUN),
   247    INTR ("tan", FALSE, NO_TEXT, "tanf", REAL, 4, 1, REAL, 4, xtan, NO_FUN, NO_FUN),
   248    INTR ("tan", FALSE, NO_TEXT, "tan", REAL, 8, 1, REAL, 8, xtan, NO_FUN, NO_FUN),
   249    INTR ("tan", FALSE, NO_TEXT, "tanq", REAL, 16, 1, REAL, 16, xtan, NO_FUN, NO_FUN),
   250    INTR ("tan", FALSE, NO_TEXT, "xtan", REAL, 32, 1, REAL, 32, xtan, NO_FUN, NO_FUN),
   251    INTR ("tanh", FALSE, NO_TEXT, "tanhf", REAL, 4, 1, REAL, 4, xtanh, NO_FUN, NO_FUN),
   252    INTR ("tanh", FALSE, NO_TEXT, "tanh", REAL, 8, 1, REAL, 8, xtanh, NO_FUN, NO_FUN),
   253    INTR ("tanh", FALSE, NO_TEXT, "tanhq", REAL, 16, 1, REAL, 16, xtanh, NO_FUN, NO_FUN),
   254    INTR ("tanh", FALSE, NO_TEXT, "xtanh", REAL, 32, 1, REAL, 32, xtanh, NO_FUN, NO_FUN),
   255    INTR ("xext", FALSE, NO_TEXT, "dbltox", REAL, 32, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   256    INTR ("xext", FALSE, NO_TEXT, "dbltox", REAL, 32, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   257    INTR ("xext", FALSE, NO_TEXT, "quadtox", REAL, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   258    INTR ("xext", FALSE, NO_TEXT, "", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   259  // REAL*4 specific
   260    INTR ("acosf", TRUE, NO_TEXT, "acosf", REAL, 4, 1, REAL, 4, xacos, NO_FUN, NO_FUN),
   261    INTR ("acoshf", TRUE, NO_TEXT, "acoshf", REAL, 4, 1, REAL, 4, xacosh, NO_FUN, NO_FUN),
   262    INTR ("acotanf", TRUE, NO_TEXT, "acotanf", REAL, 4, 1, REAL, 4, xacotan, NO_FUN, NO_FUN),
   263    INTR ("atan2f", TRUE, NO_TEXT, "atan2f", REAL, 4, 2, REAL, 4, NO_FUN, xatan2, NO_FUN),
   264    INTR ("atanf", TRUE, NO_TEXT, "atanf", REAL, 4, 1, REAL, 4, xatan, NO_FUN, NO_FUN),
   265    INTR ("atanhf", TRUE, NO_TEXT, "atanhf", REAL, 4, 1, REAL, 4, xatanh, NO_FUN, NO_FUN),
   266    INTR ("asinf", TRUE, NO_TEXT, "asinf", REAL, 4, 1, REAL, 4, xasin, NO_FUN, NO_FUN),
   267    INTR ("asinhf", FALSE, NO_TEXT, "asinhf", REAL, 4, 1, REAL, 4, xasinh, NO_FUN, NO_FUN),
   268    INTR ("cosf", TRUE, NO_TEXT, "cosf", REAL, 4, 1, REAL, 4, xcos, NO_FUN, NO_FUN),
   269    INTR ("coshf", TRUE, NO_TEXT, "coshf", REAL, 4, 1, REAL, 4, xcosh, NO_FUN, NO_FUN),
   270    INTR ("cotanf", TRUE, NO_TEXT, "cotanf", REAL, 4, 1, REAL, 4, xcotan, NO_FUN, NO_FUN),
   271    INTR ("expf", TRUE, NO_TEXT, "expf", REAL, 4, 1, REAL, 4, xexp, NO_FUN, NO_FUN),
   272    INTR ("log10f", TRUE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
   273    INTR ("logf", TRUE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
   274    INTR ("sinf", TRUE, NO_TEXT, "sinf", REAL, 4, 1, REAL, 4, xsin, NO_FUN, NO_FUN),
   275    INTR ("sinhf", TRUE, NO_TEXT, "sinhf", REAL, 4, 1, REAL, 4, xsinh, NO_FUN, NO_FUN),
   276    INTR ("sqrtf", TRUE, NO_TEXT, "sqrtf", REAL, 4, 1, REAL, 4, xsqrt, NO_FUN, NO_FUN),
   277    INTR ("tanf", TRUE, NO_TEXT, "tanf", REAL, 4, 1, REAL, 4, xtan, NO_FUN, NO_FUN),
   278    INTR ("tanhf", TRUE, NO_TEXT, "tanhf", REAL, 4, 1, REAL, 4, xtanh, NO_FUN, NO_FUN),
   279  // REAL specific
   280    INTR ("alog10", TRUE, NO_TEXT, "log10f", REAL, 4, 1, REAL, 4, xlog10, NO_FUN, NO_FUN),
   281    INTR ("alog", TRUE, NO_TEXT, "logf", REAL, 4, 1, REAL, 4, xlog, NO_FUN, NO_FUN),
   282    INTR ("amax1", TRUE, NO_TEXT, "_max", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   283    INTR ("amin1", TRUE, NO_TEXT, "_min", REAL, 4, 0, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   284    INTR ("amod", TRUE, NO_TEXT, "fmodf", REAL, 4, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   285    INTR ("dabs", TRUE, NO_TEXT, "_abs", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   286    INTR ("dacosh", TRUE, NO_TEXT, "acosh", REAL, 8, 1, REAL, 8, xacosh, NO_FUN, NO_FUN),
   287    INTR ("dacos", TRUE, NO_TEXT, "acos", REAL, 8, 1, REAL, 8, xacos, NO_FUN, NO_FUN),
   288    INTR ("dacotan", TRUE, NO_TEXT, "dacotan", REAL, 8, 1, REAL, 8, xacotan, NO_FUN, NO_FUN),
   289    INTR ("dasinh", TRUE, NO_TEXT, "asinh", REAL, 8, 1, REAL, 8, xasinh, NO_FUN, NO_FUN),
   290    INTR ("dasin", TRUE, NO_TEXT, "asin", REAL, 8, 1, REAL, 8, xasin, NO_FUN, NO_FUN),
   291    INTR ("datan2", TRUE, NO_TEXT, "atan2", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   292    INTR ("datanh", TRUE, NO_TEXT, "atanh", REAL, 8, 1, REAL, 8, xatanh, NO_FUN, NO_FUN),
   293    INTR ("datan", TRUE, NO_TEXT, "atan", REAL, 8, 1, REAL, 8, xatan, NO_FUN, NO_FUN),
   294    INTR ("dbleq", FALSE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 16, _xI, NO_FUN, NO_FUN),
   295    INTR ("dcosh", TRUE, NO_TEXT, "cosh", REAL, 8, 1, REAL, 8, xcosh, NO_FUN, NO_FUN),
   296    INTR ("dcos", TRUE, NO_TEXT, "cos", REAL, 8, 1, REAL, 8, xcos, NO_FUN, NO_FUN),
   297    INTR ("dcotan", TRUE, NO_TEXT, "cotan", REAL, 8, 1, REAL, 8, xcotan, NO_FUN, NO_FUN),
   298    INTR ("ddim", TRUE, NO_TEXT, "_dim_", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   299    INTR ("dexp", TRUE, NO_TEXT, "exp", REAL, 8, 1, REAL, 8, xexp, NO_FUN, NO_FUN),
   300    INTR ("dint", TRUE, NO_TEXT, "_aintd", REAL, 8, 1, REAL, 8, _aintx, NO_FUN, NO_FUN),
   301    INTR ("dlog10", TRUE, NO_TEXT, "log10", REAL, 8, 1, REAL, 8, xlog10, NO_FUN, NO_FUN),
   302    INTR ("dlog", TRUE, NO_TEXT, "log", REAL, 8, 1, REAL, 8, xlog, NO_FUN, NO_FUN),
   303    INTR ("dmax1", TRUE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   304    INTR ("dmax", TRUE, NO_TEXT, "_max", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   305    INTR ("dmin", TRUE, NO_TEXT, "_min", REAL, 8, 0, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   306    INTR ("dmod", TRUE, NO_TEXT, "fmod", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   307    INTR ("dnint", TRUE, NO_TEXT, "_anintd", REAL, 8, 1, REAL, 8, _anintx, NO_FUN, NO_FUN),
   308    INTR ("dreal", TRUE, NO_TEXT, "(real_8)", REAL, 8, 1, REAL, 4, _xI, NO_FUN, NO_FUN),
   309    INTR ("dsign", TRUE, NO_TEXT, "_sign", REAL, 8, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   310    INTR ("dsinh", TRUE, NO_TEXT, "sinh", REAL, 8, 1, REAL, 8, xsinh, NO_FUN, NO_FUN),
   311    INTR ("dsin", TRUE, NO_TEXT, "sin", REAL, 8, 1, REAL, 8, xsin, NO_FUN, NO_FUN),
   312    INTR ("dsqrt", TRUE, NO_TEXT, "sqrt", REAL, 8, 1, REAL, 8, xsqrt, NO_FUN, NO_FUN),
   313    INTR ("dtanh", TRUE, NO_TEXT, "tanh", REAL, 8, 1, REAL, 8, xtanh, NO_FUN, NO_FUN),
   314    INTR ("dtan", TRUE, NO_TEXT, "tan", REAL, 8, 1, REAL, 8, xtan, NO_FUN, NO_FUN),
   315    INTR ("qabs", TRUE, NO_TEXT, "_abs", REAL, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   316    INTR ("qacosh", TRUE, NO_TEXT, "acoshq", REAL, 16, 1, REAL, 16, xacosh, NO_FUN, NO_FUN),
   317    INTR ("qacos", TRUE, NO_TEXT, "acosq", REAL, 16, 1, REAL, 16, xacos, NO_FUN, NO_FUN),
   318    INTR ("qacotan", TRUE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xacotan, NO_FUN, NO_FUN),
   319    INTR ("qasinh", TRUE, NO_TEXT, "asinhq", REAL, 16, 1, REAL, 16, xasinh, NO_FUN, NO_FUN),
   320    INTR ("qasin", TRUE, NO_TEXT, "asinq", REAL, 16, 1, REAL, 16, xasin, NO_FUN, NO_FUN),
   321    INTR ("qatan2", TRUE, NO_TEXT, "atan2q", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   322    INTR ("qatanh", TRUE, NO_TEXT, "atanhq", REAL, 16, 1, REAL, 16, xatanh, NO_FUN, NO_FUN),
   323    INTR ("qatan", TRUE, NO_TEXT, "atanq", REAL, 16, 1, REAL, 16, xatan, NO_FUN, NO_FUN),
   324    INTR ("qcosh", TRUE, NO_TEXT, "coshq", REAL, 16, 1, REAL, 16, xcosh, NO_FUN, NO_FUN),
   325    INTR ("qcos", TRUE, NO_TEXT, "cosq", REAL, 16, 1, REAL, 16, xcos, NO_FUN, NO_FUN),
   326    INTR ("qcotan", TRUE, NO_TEXT, "cotanq", REAL, 16, 1, REAL, 16, xcotan, NO_FUN, NO_FUN),
   327    INTR ("qdim", TRUE, NO_TEXT, "_dim_", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   328    INTR ("qexp", TRUE, NO_TEXT, "expq", REAL, 16, 1, REAL, 16, xexp, NO_FUN, NO_FUN),
   329    INTR ("qextd", TRUE, NO_TEXT, "_qext", REAL, 16, 1, REAL, 8, _xI, NO_FUN, NO_FUN),
   330    INTR ("qextx", TRUE, NO_TEXT, "xtoquad", REAL, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   331    INTR ("qint", TRUE, NO_TEXT, "_aintq", REAL, 16, 1, REAL, 16, _aintx, NO_FUN, NO_FUN),
   332    INTR ("qlog10", TRUE, NO_TEXT, "log10q", REAL, 16, 1, REAL, 16, xlog10, NO_FUN, NO_FUN),
   333    INTR ("qlog", TRUE, NO_TEXT, "logq", REAL, 16, 1, REAL, 16, xlog, NO_FUN, NO_FUN),
   334    INTR ("qmax1", TRUE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   335    INTR ("qmax", TRUE, NO_TEXT, "_max", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   336    INTR ("qmin1", TRUE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   337    INTR ("qmin", TRUE, NO_TEXT, "_min", REAL, 16, 0, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   338    INTR ("qmod", TRUE, NO_TEXT, "fmodq", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   339    INTR ("qmod", TRUE, NO_TEXT, "_qmod", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   340    INTR ("qnint", TRUE, NO_TEXT, "_anintq", REAL, 16, 1, REAL, 16, _anintx, NO_FUN, NO_FUN),
   341    INTR ("qsign", TRUE, NO_TEXT, "_sign", REAL, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   342    INTR ("qsinh", TRUE, NO_TEXT, "sinhq", REAL, 16, 1, REAL, 16, xsinh, NO_FUN, NO_FUN),
   343    INTR ("qsin", TRUE, NO_TEXT, "sinq", REAL, 16, 1, REAL, 16, xsin, NO_FUN, NO_FUN),
   344    INTR ("qsqrt", TRUE, NO_TEXT, "sqrtq", REAL, 16, 1, REAL, 16, xsqrt, NO_FUN, NO_FUN),
   345    INTR ("qtanh", TRUE, NO_TEXT, "tanhq", REAL, 16, 1, REAL, 16, xtanh, NO_FUN, NO_FUN),
   346    INTR ("qtan", TRUE, NO_TEXT, "tanq", REAL, 16, 1, REAL, 16, xtan, NO_FUN, NO_FUN),
   347    INTR ("snglq", TRUE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   348    INTR ("sngl", TRUE, NO_TEXT, "(real_4)", REAL, 4, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   349    INTR ("snglx", TRUE, NO_TEXT, "xtoflt", REAL, 4, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   350    INTR ("xabs", TRUE, NO_TEXT, "xabs", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   351    INTR ("xacosh", TRUE, NO_TEXT, "xacosh", REAL, 32, 1, REAL, 32, xacosh, NO_FUN, NO_FUN),
   352    INTR ("xacos", TRUE, NO_TEXT, "xacos", REAL, 32, 1, REAL, 32, xacos, NO_FUN, NO_FUN),
   353    INTR ("xacotan", TRUE, NO_TEXT, "xacotan", REAL, 32, 1, REAL, 32, xacotan, NO_FUN, NO_FUN),
   354    INTR ("xasinh", TRUE, NO_TEXT, "xasinh", REAL, 32, 1, REAL, 32, xasinh, NO_FUN, NO_FUN),
   355    INTR ("xasin", TRUE, NO_TEXT, "xasin", REAL, 32, 1, REAL, 32, xasin, NO_FUN, NO_FUN),
   356    INTR ("xatan2", TRUE, NO_TEXT, "xatan2", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   357    INTR ("xatanh", TRUE, NO_TEXT, "xatanh", REAL, 32, 1, REAL, 32, xatanh, NO_FUN, NO_FUN),
   358    INTR ("xatan", TRUE, NO_TEXT, "xatan", REAL, 32, 1, REAL, 32, xatan, NO_FUN, NO_FUN),
   359    INTR ("xcosh", TRUE, NO_TEXT, "xcosh", REAL, 32, 1, REAL, 32, xcosh, NO_FUN, NO_FUN),
   360    INTR ("xcos", TRUE, NO_TEXT, "xcos", REAL, 32, 1, REAL, 32, xcos, NO_FUN, NO_FUN),
   361    INTR ("xcotan", TRUE, NO_TEXT, "xcotan", REAL, 32, 1, REAL, 32, xcotan, NO_FUN, NO_FUN),
   362    INTR ("xdble", TRUE, NO_TEXT, "xtodbl", REAL, 8, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   363    INTR ("xdim", TRUE, NO_TEXT, "_xdimx", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   364    INTR ("xexp", TRUE, NO_TEXT, "xexp", REAL, 32, 1, REAL, 32, xexp, NO_FUN, NO_FUN),
   365    INTR ("xint", TRUE, NO_TEXT, "_aintx", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   366    INTR ("xlog10", TRUE, NO_TEXT, "xlog10", REAL, 32, 1, REAL, 32, xlog10, NO_FUN, NO_FUN),
   367    INTR ("xlog", TRUE, NO_TEXT, "xlog", REAL, 32, 1, REAL, 32, xlog, NO_FUN, NO_FUN),
   368    INTR ("xmax1", TRUE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   369    INTR ("xmax", TRUE, NO_TEXT, "_xmax", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   370    INTR ("xmin1", TRUE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   371    INTR ("xmin", TRUE, NO_TEXT, "_xmin", REAL, 32, 0, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   372    INTR ("xmod", TRUE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   373    INTR ("xmod", TRUE, NO_TEXT, "_xmod", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   374    INTR ("xnint", TRUE, NO_TEXT, "_anintx", REAL, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   375    INTR ("xsign", TRUE, NO_TEXT, "_xsgn", REAL, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   376    INTR ("xsinh", TRUE, NO_TEXT, "xsinh", REAL, 32, 1, REAL, 32, xsinh, NO_FUN, NO_FUN),
   377    INTR ("xsin", TRUE, NO_TEXT, "xsin", REAL, 32, 1, REAL, 32, xsin, NO_FUN, NO_FUN),
   378    INTR ("xsqrt", TRUE, NO_TEXT, "xsqrt", REAL, 32, 1, REAL, 32, xsqrt, NO_FUN, NO_FUN),
   379    INTR ("xtanh", TRUE, NO_TEXT, "xtanh", REAL, 32, 1, REAL, 32, xtanh, NO_FUN, NO_FUN),
   380    INTR ("xtan", TRUE, NO_TEXT, "xtan", REAL, 32, 1, REAL, 32, xtan, NO_FUN, NO_FUN),
   381  // COMPLEX generic
   382    INTR ("abs", FALSE, NO_TEXT, "cabsf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   383    INTR ("abs", FALSE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   384    INTR ("abs", FALSE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   385    INTR ("abs", FALSE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   386    INTR ("aimag", FALSE, NO_TEXT, "cimagf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   387    INTR ("aimag", FALSE, "(real_4)", "cimagq", REAL, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   388    INTR ("aimag", FALSE, "(real_4)", "cimag", REAL, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   389    INTR ("aimag", FALSE, "xtoflt", "cximag", REAL, 4, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   390    INTR ("cabs", FALSE, NO_TEXT, "cabsf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   391    INTR ("cabs", FALSE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   392    INTR ("cabs", FALSE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   393    INTR ("cabs", FALSE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   394    INTR ("ccos", FALSE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
   395    INTR ("ccos", FALSE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
   396    INTR ("ccos", FALSE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
   397    INTR ("ccos", FALSE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   398    INTR ("cexp", FALSE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
   399    INTR ("cexp", FALSE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
   400    INTR ("cexp", FALSE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
   401    INTR ("cexp", FALSE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   402    INTR ("cint", FALSE, "(int_4)", "crealf", INTEGER, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   403    INTR ("cint", FALSE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   404    INTR ("cint", FALSE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   405    INTR ("clog", FALSE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
   406    INTR ("clog", FALSE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
   407    INTR ("clog", FALSE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
   408    INTR ("clog", FALSE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   409    INTR ("cmplx", FALSE, NO_TEXT, "CMPLXF", COMPLEX, 8, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   410    INTR ("cmplx", FALSE, NO_TEXT, "CMPLX", COMPLEX, 16, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   411    INTR ("cmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   412    INTR ("cmplx", FALSE, NO_TEXT, "CMPLXX", COMPLEX, 64, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   413    INTR ("cmplx", FALSE, NO_TEXT, "(complex_8)", COMPLEX, 8, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   414    INTR ("cmplx", FALSE, NO_TEXT, "(complex_16)", COMPLEX, 16, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   415    INTR ("cmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   416    INTR ("cmplx", FALSE, NO_TEXT, "cxconv", COMPLEX, 64, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   417    INTR ("conjg", FALSE, NO_TEXT, "conjf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   418    INTR ("conjg", FALSE, NO_TEXT, "conj", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   419    INTR ("conjg", FALSE, NO_TEXT, "conjq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   420    INTR ("conjg", FALSE, NO_TEXT, "cxconj", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   421    INTR ("cos", FALSE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
   422    INTR ("cos", FALSE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
   423    INTR ("cos", FALSE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
   424    INTR ("cos", FALSE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   425    INTR ("csin", FALSE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
   426    INTR ("csin", FALSE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
   427    INTR ("csin", FALSE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   428    INTR ("csin", FALSE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
   429    INTR ("csqrt", FALSE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
   430    INTR ("csqrt", FALSE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
   431    INTR ("csqrt", FALSE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
   432    INTR ("csqrt", FALSE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   433    INTR ("ctan", FALSE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
   434    INTR ("ctan", FALSE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
   435    INTR ("ctan", FALSE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
   436    INTR ("ctan", FALSE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   437    INTR ("dble", FALSE, "(real_8)", "crealf", REAL, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   438    INTR ("dble", FALSE, "(real_8)", "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   439    INTR ("dble", FALSE, "(real_8)", "crealq", REAL, 8, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   440    INTR ("dble", FALSE, "(real_8)", "cxrealq", REAL, 8, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   441    INTR ("dcmplx", FALSE, "(complex_16)", "CMPLXF", COMPLEX, 16, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   442    INTR ("dcmplx", FALSE, NO_TEXT, "CMPLX", COMPLEX, 16, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   443    INTR ("dcmplx", FALSE, "(complex_16)", "CMPLXQ", COMPLEX, 16, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   444    INTR ("dcmplx", FALSE, "(complex_16)", "qxcmplx", COMPLEX, 16, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   445    INTR ("dcmplx", FALSE, "(complex_16)", "(real_8)", COMPLEX, 16, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   446    INTR ("dcmplx", FALSE, NO_TEXT, "(complex_16)", COMPLEX, 16, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   447    INTR ("dcmplx", FALSE, "(complex_16)", "(real_8)", COMPLEX, 16, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   448    INTR ("dcmplx", FALSE, "(complex_16)", "qxcmplx", COMPLEX, 16, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   449    INTR ("dimag", FALSE, "(real_8)", "cimagf", REAL, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   450    INTR ("dimag", FALSE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   451    INTR ("dimag", FALSE, "(real_8)", "cimagq", REAL, 8, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   452    INTR ("dimag", FALSE, "xtodbl", "cximag", REAL, 8, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   453    INTR ("exp", FALSE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
   454    INTR ("exp", FALSE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
   455    INTR ("exp", FALSE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
   456    INTR ("exp", FALSE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   457    INTR ("imag", FALSE, NO_TEXT, "cimagf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   458    INTR ("imag", FALSE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   459    INTR ("imag", FALSE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   460    INTR ("imag", FALSE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   461    INTR ("int", FALSE, "(int_4)", "crealf", INTEGER, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   462    INTR ("int", FALSE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   463    INTR ("int", FALSE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   464    INTR ("int", FALSE, "(int_4)", "cxreal", INTEGER, 4, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   465    INTR ("log", FALSE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
   466    INTR ("log", FALSE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
   467    INTR ("log", FALSE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
   468    INTR ("log", FALSE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   469    INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   470    INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   471    INTR ("qcmplx", FALSE, NO_TEXT, "CMPLXQ", COMPLEX, 32, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   472    INTR ("qcmplx", FALSE, NO_TEXT, "qxcmplx", COMPLEX, 32, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   473    INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   474    INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   475    INTR ("qcmplx", FALSE, NO_TEXT, "(complex_32)", COMPLEX, 32, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   476    INTR ("qcmplx", FALSE, "(complex_32)", "xtoquad", COMPLEX, 32, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   477    INTR ("qimag", FALSE, "(real_16)", "cimagf", REAL, 16, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   478    INTR ("qimag", FALSE, "(real_16)", "cimag", REAL, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   479    INTR ("qimag", FALSE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   480    INTR ("qimag", FALSE, NO_TEXT, "cximagq", REAL, 16, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   481    INTR ("real", FALSE, "(real_4)", "crealf", REAL, 4, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   482    INTR ("real", FALSE, "(real_4)", "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   483    INTR ("real", FALSE, "(real_4)", "crealq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   484    INTR ("real", FALSE, "(real_4)", "cxrealq", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   485    INTR ("sin", FALSE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
   486    INTR ("sin", FALSE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
   487    INTR ("sin", FALSE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
   488    INTR ("sin", FALSE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   489    INTR ("sqrt", FALSE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
   490    INTR ("sqrt", FALSE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
   491    INTR ("sqrt", FALSE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
   492    INTR ("sqrt", FALSE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   493    INTR ("tan", FALSE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
   494    INTR ("tan", FALSE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
   495    INTR ("tan", FALSE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
   496    INTR ("tan", FALSE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   497    INTR ("xcmplx", FALSE, NO_TEXT, "cxflt", COMPLEX, 64, 2, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   498    INTR ("xcmplx", FALSE, NO_TEXT, "cxdbl", COMPLEX, 64, 2, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   499    INTR ("xcmplx", FALSE, NO_TEXT, "cxquad", COMPLEX, 64, 2, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   500    INTR ("xcmplx", FALSE, NO_TEXT, "CMPLXX", COMPLEX, 64, 2, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   501    INTR ("xcmplx", FALSE, "cxconv", "flttox", COMPLEX, 64, 1, REAL, 4, NO_FUN, NO_FUN, NO_FUN),
   502    INTR ("xcmplx", FALSE, "cxconv", "dbltox", COMPLEX, 64, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   503    INTR ("xcmplx", FALSE, "cxconv", "quadtox", COMPLEX, 64, 1, REAL, 16, NO_FUN, NO_FUN, NO_FUN),
   504    INTR ("xcmplx", FALSE, NO_TEXT, "cxconv", COMPLEX, 64, 1, REAL, 32, NO_FUN, NO_FUN, NO_FUN),
   505    INTR ("ximag", FALSE, "flttox", "cimagf", REAL, 32, 1, COMPLEX, 8, NO_FUN, NO_FUN, NO_FUN),
   506    INTR ("ximag", FALSE, "dbltox", "cimag", REAL, 32, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   507    INTR ("ximag", FALSE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   508    INTR ("ximag", FALSE, "quadtox", "cimagq", REAL, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   509  // COMPLEX*8 specific
   510    INTR ("cabs", TRUE, NO_TEXT, "_zabs_16", REAL, 8, 1, REAL, 8, NO_FUN, NO_FUN, NO_FUN),
   511    INTR ("ccosf", TRUE, NO_TEXT, "ccosf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxcos),
   512    INTR ("cexpf", TRUE, NO_TEXT, "cexpf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxexp),
   513    INTR ("clogf", TRUE, NO_TEXT, "clogf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxlog),
   514    INTR ("csinf", TRUE, NO_TEXT, "csinf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsin),
   515    INTR ("csqrtf", TRUE, NO_TEXT, "csqrtf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxsqrt),
   516    INTR ("ctanf", TRUE, NO_TEXT, "ctanf", COMPLEX, 8, 1, COMPLEX, 8, NO_FUN, NO_FUN, cxtan),
   517  // COMPLEX specific
   518    INTR ("cdabs", TRUE, NO_TEXT, "cabs", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   519    INTR ("cdcos", TRUE, NO_TEXT, "ccos", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxcos),
   520    INTR ("cdexp", TRUE, NO_TEXT, "cexp", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxexp),
   521    INTR ("cdint", TRUE, "(int_4)", "creal", INTEGER, 4, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   522    INTR ("cdlog", TRUE, NO_TEXT, "clog", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxlog),
   523    INTR ("cdsin", TRUE, NO_TEXT, "csin", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsin),
   524    INTR ("cdsqrt", TRUE, NO_TEXT, "csqrt", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxsqrt),
   525    INTR ("cdtan", TRUE, NO_TEXT, "ctan", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, cxtan),
   526    INTR ("cqabs", TRUE, NO_TEXT, "cabsq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   527    INTR ("cqcos", TRUE, NO_TEXT, "ccosq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxcos),
   528    INTR ("cqexp", TRUE, NO_TEXT, "cexpq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxexp),
   529    INTR ("cqint", TRUE, "(int_4)", "crealq", INTEGER, 4, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   530    INTR ("cqlog", TRUE, NO_TEXT, "clogq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxlog),
   531    INTR ("cqsin", TRUE, NO_TEXT, "csinq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsin),
   532    INTR ("cqsqrt", TRUE, NO_TEXT, "csqrtq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxsqrt),
   533    INTR ("cqtan", TRUE, NO_TEXT, "ctanq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, cxtan),
   534    INTR ("cxabs", TRUE, NO_TEXT, "cxabs", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   535    INTR ("cxcos", TRUE, NO_TEXT, "cxcos", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   536    INTR ("cxexp", TRUE, NO_TEXT, "cxexp", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   537    INTR ("cxlog", TRUE, NO_TEXT, "cxlog", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   538    INTR ("cxsin", TRUE, NO_TEXT, "cxsin", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   539    INTR ("cxsqrt", TRUE, NO_TEXT, "cxsqrt", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   540    INTR ("cxtan", TRUE, NO_TEXT, "cxtan", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   541    INTR ("dconjg", TRUE, NO_TEXT, "conj", COMPLEX, 16, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   542    INTR ("dimag", TRUE, NO_TEXT, "cimag", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   543    INTR ("dreal", TRUE, NO_TEXT, "creal", REAL, 8, 1, COMPLEX, 16, NO_FUN, NO_FUN, NO_FUN),
   544    INTR ("qconjg", TRUE, NO_TEXT, "conjq", COMPLEX, 32, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   545    INTR ("qimag", TRUE, NO_TEXT, "cimagq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   546    INTR ("qreal", TRUE, NO_TEXT, "crealq", REAL, 16, 1, COMPLEX, 32, NO_FUN, NO_FUN, NO_FUN),
   547    INTR ("xconjg", TRUE, NO_TEXT, "cxconj", COMPLEX, 64, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   548    INTR ("ximag", TRUE, NO_TEXT, "cximag", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   549    INTR ("xreal", TRUE, NO_TEXT, "cxreal", REAL, 32, 1, COMPLEX, 64, NO_FUN, NO_FUN, NO_FUN),
   550  // End of list
   551    INTR (NO_TEXT, FALSE, NO_TEXT, NO_TEXT, NOTYPE, 0, 0, NOTYPE, 0, NO_FUN, NO_FUN, NO_FUN)
   552  };
   553  
   554  logical_4 is_intrins (char *name, MODE *result)
   555  {
   556    for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   557      if (EQUAL (name, fun[k].ffun)) {
   558        if (result != NO_MODE) {
   559          result->type = fun[k].rtyp;
   560          result->len = fun[k].rlen;
   561        }
   562        return TRUE;
   563      }
   564    }
   565    return FALSE;
   566  }
   567  
   568  logical_4 is_specific (char *name)
   569  {
   570  // Match name for table to approve for INTRINSIC statement.
   571    for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   572      if (EQUAL (name, fun[k].ffun)) {
   573        return fun[k].spec;
   574      }
   575    }
   576    return FALSE;
   577  }
   578  
   579  logical_4 intrinsic_call (char *name, EXPR * loc)
   580  {
   581    EXPR lhs, rhs;
   582  // If 'name' is not an intrinsic function, stop here.
   583    if (! is_intrins (name, NO_MODE)) {
   584      return FALSE;
   585    }
   586  //
   587    memset (loc, 0, sizeof (EXPR));
   588    (void) scan (EXPECT_NONE);
   589    if (! TOKEN ("(")) {
   590      UNSCAN;
   591      return FALSE;
   592    }
   593    (void) scan (EXPECT_NONE);
   594    express (&lhs, NOTYPE, 0);
   595    if (!valid_expr (&lhs)) {
   596      return FALSE;
   597    }
   598    (void) scan (EXPECT_NONE);
   599    if (!TOKEN (",") && (lhs.mode.type == CHARACTER)) {
   600  // 1 operand, CHARACTER, length independent.
   601      UNSCAN;
   602      for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   603        INTRINS *F = &fun[k];
   604        if (EQUAL (name, F->ffun) && (lhs.mode.type == F->atyp)) {
   605          _srecordf (loc->str, "%s (%s)", F->cfun, lhs.str);
   606          loc->mode = (MODE) { .type = F->rtyp,.len = F->rlen,.dim = 0};
   607          (void) scan (")");
   608          return TRUE;
   609        }
   610      }
   611      NEW_RECORD (str);
   612      _srecordf (str, "%s (%s)", name, qtype (&(lhs.mode)));
   613      ERROR (2201, "undefined", str);
   614      (void) scan (")");
   615      return FALSE;
   616    } else if (!TOKEN (",")) {
   617  // 1 operand.
   618      UNSCAN;
   619      for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   620        INTRINS *F = &fun[k];
   621        if (EQUAL (name, F->ffun) && F->anum == 1 && accept_mode (lhs.mode.type, lhs.mode.len, F->atyp, F->alen)) {
   622          if (fold_intrinsic (F, &lhs, NO_EXPR)) {
   623            _srecordf (loc->str, "%s", lhs.str);
   624            loc->variant = EXPR_CONST;
   625            loc->mode = (MODE) { .type = F->rtyp, .len = _max (F->rlen, lhs.mode.len), .dim = 0};
   626          } else if (F->bfun != NO_TEXT) {
   627            _srecordf (loc->str, "%s (%s (%s))", F->bfun, F->cfun, lhs.str);
   628            loc->mode = (MODE) { .type = F->rtyp, .len = F->rlen, .dim = 0};
   629          } else {
   630            _srecordf (loc->str, "%s (%s)", F->cfun, lhs.str);
   631            loc->mode = (MODE) { .type = F->rtyp, .len = F->rlen, .dim = 0};
   632          }
   633          (void) scan (")");
   634          return TRUE;
   635        }
   636      }
   637      NEW_RECORD (str);
   638      _srecordf (str, "%s (%s)", name, qtype (&(lhs.mode)));
   639      ERROR (2202, "undefined", str);
   640      (void) scan (")");
   641      return FALSE;
   642    } else {
   643  // >= 2 operands
   644      (void) scan (EXPECT_NONE);
   645      express (&rhs, NOTYPE, 0);
   646      if (!valid_expr (&rhs)) {
   647        return FALSE;
   648      }
   649      int_4 llen = lhs.mode.len, rlen = rhs.mode.len;
   650      if ((lhs.variant == EXPR_CONST || rhs.variant == EXPR_CONST)) {
   651  // Cross terms involving constants - adapt to non-constant.
   652        if (lhs.variant != EXPR_CONST) {
   653          rlen = llen;
   654        } else if (rhs.variant != EXPR_CONST) {
   655          llen = rlen;
   656        } else {
   657          llen = rlen = _max (llen, rlen);
   658        }
   659      } else {
   660        llen = rlen = _max (llen, rlen);
   661      }
   662      for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   663        INTRINS *F = &fun[k];
   664        if (EQUAL (name, F->ffun) && F->anum != 1 && accept_mode (lhs.mode.type, lhs.mode.len, F->atyp, F->alen) && accept_mode (rhs.mode.type, rhs.mode.len, F->atyp, F->alen)) {
   665          loc->mode = (MODE) {.type = F->rtyp, .len = F->rlen, .dim = 0};
   666          (void) scan (EXPECT_NONE);
   667          if (TOKEN (")") && (F->anum == 2 || F->anum == 0)) {
   668  // 2 operands
   669            if (fold_intrinsic (F, &lhs, &rhs)) {
   670              _srecordf (loc->str, "%s", lhs.str);
   671              loc->variant = EXPR_CONST;
   672              loc->mode = (MODE) { .type = F->rtyp, .len = _max (lhs.mode.len, rhs.mode.len) , .dim = 0};
   673            } else if (F->bfun != NO_TEXT) {
   674              _srecordf (loc->str, "%s (%s (%s, %s))", F->bfun, F->cfun, lhs.str, rhs.str);
   675            } else {
   676              _srecordf (loc->str, "%s (%s, %s)", F->cfun, lhs.str, rhs.str);
   677            }
   678            return TRUE;
   679          } else if (TOKEN (",") && F->anum == 0) {
   680  // > 2 operands
   681            NEW_RECORD (idf); NEW_RECORD (str); NEW_RECORD (tmp);
   682            _srecordf (idf, "%s", edit_tmp (nloctmps++));
   683            add_local (idf, loc->mode.type, loc->mode.len, UNIQ, NOPATCH, NOARG, LOCAL, TEMP);
   684            str[0] = '\0';
   685            _srecordf (str, "%s = %s (%s, %s)", idf, F->cfun, lhs.str, rhs.str);
   686            while (TOKEN (",")) {
   687              (void) scan (EXPECT_NONE);
   688              express (&rhs, NOTYPE, 0);
   689              (void) scan (EXPECT_NONE);
   690              if (TOKEN (",")) {
   691                _srecordf (tmp, ", %s = %s (%s, %s)", idf, F->cfun, idf, rhs.str);
   692              } else if (TOKEN (")")) {
   693                _srecordf (tmp, ", %s (%s, %s)", F->cfun, idf, rhs.str);
   694              } else {
   695                EXPECT (2203, ", or )");
   696              }
   697              bufcat (str, tmp, RECLN);
   698            }
   699            _srecordf (loc->str, "(%s)", str);
   700            return TRUE;
   701          } else {
   702            SYNTAX (2204, "number of operands");
   703          }
   704        }
   705      }
   706      NEW_RECORD (str);
   707      _srecordf (str, "%s (%s, %s)", name, qtype (&(lhs.mode)), qtype (&(rhs.mode)));
   708      ERROR (2205, "undefined", str);
   709      (void) scan (")");
   710      return FALSE;
   711    }
   712  }
   713  
   714  void compile_nested_intrinsic (char *name)
   715  {
   716  // Compile a nested function for an INTRINSIC declared function.
   717    INTRINS *F = NO_INTRINS;
   718    NEW_STATIC_RECORD (f);
   719    for (int_4 k = 0; fun[k].ffun != NO_TEXT; k++) {
   720      if (EQUAL (fun[k].ffun, name)) {
   721        F = &fun[k];
   722        break;
   723      }
   724    }
   725    if (F == NO_INTRINS) {
   726      ERROR (2206, "not an intrinsic fuction", name);
   727      return;
   728    }
   729    if (!F->spec || F->anum == 0) {
   730  // Silently return.
   731      return;
   732    }
   733    MODE res = (MODE) {.type = F->rtyp, .len = F->rlen};
   734    MODE arg = (MODE) {.type = F->atyp, .len = F->alen};
   735    IDENT *idf = add_local (name, NOTYPE, NOLEN, UNIQ, NOPATCH, NOARG, LOCAL, TEMP);
   736    if (idf->external) {
   737       ERROR (2207, "redefining external function", C_NAME (idf));
   738    } else if (idf->intrinsic) {
   739       ERROR (2208, "redefining intrinsic function", C_NAME (idf));
   740    }
   741    if (F->anum == 1) {
   742      if (F->bfun != NO_TEXT) {
   743        _srecordf (f, "%s %s (%s __x__) {return %s (%s (%s));}\n", 
   744          wtype (&res, NOARG, NOFUN), 
   745          edit_i (name), 
   746          wtype (&arg, ARG, NOFUN), 
   747          F->bfun,
   748          F->cfun,
   749          (F->atyp == CHARACTER ? "__x__" : "*__x__")
   750        );
   751      } else { 
   752        _srecordf (f, "%s %s (%s __x__) {return %s (%s);}\n", 
   753          wtype (&res, NOARG, NOFUN), 
   754          edit_i (name), 
   755          wtype (&arg, ARG, NOFUN), 
   756          F->cfun,
   757          (F->atyp == CHARACTER ? "__x__" : "*__x__")
   758        );
   759      } 
   760    } else {
   761      if (F->bfun != NO_TEXT) {
   762        _srecordf (f, "%s %s (%s __x__, %s __y__) {return %s (%s (%s, %s));}\n", 
   763          wtype (&res, NOARG, NOFUN), 
   764          edit_i (name), 
   765          wtype (&arg, ARG, NOFUN), 
   766          wtype (&arg, ARG, NOFUN), 
   767          F->bfun,
   768          F->cfun,
   769          (F->atyp == CHARACTER ? "__x__" : "*__x__"),
   770          (F->atyp == CHARACTER ? "__y__" : "*__y__")
   771        ); 
   772      } else { 
   773        _srecordf (f, "%s %s (%s __x__, %s __y__) {return %s (%s, %s);}\n", 
   774          wtype (&res, NOARG, NOFUN), 
   775          edit_i (name), 
   776          wtype (&arg, ARG, NOFUN), 
   777          wtype (&arg, ARG, NOFUN), 
   778          F->cfun,
   779          (F->atyp == CHARACTER ? "__x__" : "*__x__"),
   780          (F->atyp == CHARACTER ? "__y__" : "*__y__")
   781        ); 
   782      }
   783    }
   784    code (nprocs, NESTED, f);
   785    idf->mode = res;
   786    idf->intrinsic = TRUE;
   787    return;
   788  }


© 2002-2025 J.M. van der Veer (jmvdveer@xs4all.nl)