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


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