Home | History | Annotate | Line # | Download | only in gcc
optabs.h revision 1.1.1.1
      1  1.1  mrg /* Definitions for code generation pass of GNU compiler.
      2  1.1  mrg    Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009
      3  1.1  mrg    Free Software Foundation, Inc.
      4  1.1  mrg 
      5  1.1  mrg This file is part of GCC.
      6  1.1  mrg 
      7  1.1  mrg GCC is free software; you can redistribute it and/or modify
      8  1.1  mrg it under the terms of the GNU General Public License as published by
      9  1.1  mrg the Free Software Foundation; either version 3, or (at your option)
     10  1.1  mrg any later version.
     11  1.1  mrg 
     12  1.1  mrg GCC is distributed in the hope that it will be useful,
     13  1.1  mrg but WITHOUT ANY WARRANTY; without even the implied warranty of
     14  1.1  mrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     15  1.1  mrg GNU General Public License for more details.
     16  1.1  mrg 
     17  1.1  mrg You should have received a copy of the GNU General Public License
     18  1.1  mrg along with GCC; see the file COPYING3.  If not see
     19  1.1  mrg <http://www.gnu.org/licenses/>.  */
     20  1.1  mrg 
     21  1.1  mrg #ifndef GCC_OPTABS_H
     22  1.1  mrg #define GCC_OPTABS_H
     23  1.1  mrg 
     24  1.1  mrg #include "insn-codes.h"
     25  1.1  mrg 
     26  1.1  mrg /* Optabs are tables saying how to generate insn bodies
     27  1.1  mrg    for various machine modes and numbers of operands.
     28  1.1  mrg    Each optab applies to one operation.
     29  1.1  mrg 
     30  1.1  mrg    For example, add_optab applies to addition.
     31  1.1  mrg 
     32  1.1  mrg    The insn_code slot is the enum insn_code that says how to
     33  1.1  mrg    generate an insn for this operation on a particular machine mode.
     34  1.1  mrg    It is CODE_FOR_nothing if there is no such insn on the target machine.
     35  1.1  mrg 
     36  1.1  mrg    The `lib_call' slot is the name of the library function that
     37  1.1  mrg    can be used to perform the operation.
     38  1.1  mrg 
     39  1.1  mrg    A few optabs, such as move_optab, are used by special code.  */
     40  1.1  mrg 
     41  1.1  mrg struct optab_handlers
     42  1.1  mrg {
     43  1.1  mrg   enum insn_code insn_code;
     44  1.1  mrg };
     45  1.1  mrg 
     46  1.1  mrg struct optab_d
     47  1.1  mrg {
     48  1.1  mrg   enum rtx_code code;
     49  1.1  mrg   const char *libcall_basename;
     50  1.1  mrg   char libcall_suffix;
     51  1.1  mrg   void (*libcall_gen)(struct optab_d *, const char *name, char suffix,
     52  1.1  mrg 		      enum machine_mode);
     53  1.1  mrg   struct optab_handlers handlers[NUM_MACHINE_MODES];
     54  1.1  mrg };
     55  1.1  mrg typedef struct optab_d * optab;
     56  1.1  mrg 
     57  1.1  mrg /* A convert_optab is for some sort of conversion operation between
     58  1.1  mrg    modes.  The first array index is the destination mode, the second
     59  1.1  mrg    is the source mode.  */
     60  1.1  mrg struct convert_optab_d
     61  1.1  mrg {
     62  1.1  mrg   enum rtx_code code;
     63  1.1  mrg   const char *libcall_basename;
     64  1.1  mrg   void (*libcall_gen)(struct convert_optab_d *, const char *name,
     65  1.1  mrg 		      enum machine_mode,
     66  1.1  mrg 		      enum machine_mode);
     67  1.1  mrg   struct optab_handlers handlers[NUM_MACHINE_MODES][NUM_MACHINE_MODES];
     68  1.1  mrg };
     69  1.1  mrg typedef struct convert_optab_d *convert_optab;
     70  1.1  mrg 
     71  1.1  mrg /* Given an enum insn_code, access the function to construct
     72  1.1  mrg    the body of that kind of insn.  */
     73  1.1  mrg #define GEN_FCN(CODE) (insn_data[CODE].genfun)
     74  1.1  mrg 
     75  1.1  mrg /* Enumeration of valid indexes into optab_table.  */
     76  1.1  mrg enum optab_index
     77  1.1  mrg {
     78  1.1  mrg   /* Fixed-point operators with signed/unsigned saturation */
     79  1.1  mrg   OTI_ssadd,
     80  1.1  mrg   OTI_usadd,
     81  1.1  mrg   OTI_sssub,
     82  1.1  mrg   OTI_ussub,
     83  1.1  mrg   OTI_ssmul,
     84  1.1  mrg   OTI_usmul,
     85  1.1  mrg   OTI_ssdiv,
     86  1.1  mrg   OTI_usdiv,
     87  1.1  mrg   OTI_ssneg,
     88  1.1  mrg   OTI_usneg,
     89  1.1  mrg   OTI_ssashl,
     90  1.1  mrg   OTI_usashl,
     91  1.1  mrg 
     92  1.1  mrg   OTI_add,
     93  1.1  mrg   OTI_addv,
     94  1.1  mrg   OTI_sub,
     95  1.1  mrg   OTI_subv,
     96  1.1  mrg 
     97  1.1  mrg   /* Signed and fp multiply */
     98  1.1  mrg   OTI_smul,
     99  1.1  mrg   OTI_smulv,
    100  1.1  mrg   /* Signed multiply, return high word */
    101  1.1  mrg   OTI_smul_highpart,
    102  1.1  mrg   OTI_umul_highpart,
    103  1.1  mrg   /* Signed multiply with result one machine mode wider than args */
    104  1.1  mrg   OTI_smul_widen,
    105  1.1  mrg   OTI_umul_widen,
    106  1.1  mrg   /* Widening multiply of one unsigned and one signed operand.  */
    107  1.1  mrg   OTI_usmul_widen,
    108  1.1  mrg   /* Signed multiply and add with the result and addend one machine mode
    109  1.1  mrg      wider than the multiplicand and multiplier.  */
    110  1.1  mrg   OTI_smadd_widen,
    111  1.1  mrg   /* Unsigned multiply and add with the result and addend one machine mode
    112  1.1  mrg      wider than the multiplicand and multiplier.  */
    113  1.1  mrg   OTI_umadd_widen,
    114  1.1  mrg   /* Signed multiply and add with the result and addend one machine mode
    115  1.1  mrg      wider than the multiplicand and multiplier.
    116  1.1  mrg      All involved operations are saturating.  */
    117  1.1  mrg   OTI_ssmadd_widen,
    118  1.1  mrg   /* Unsigned multiply and add with the result and addend one machine mode
    119  1.1  mrg      wider than the multiplicand and multiplier.
    120  1.1  mrg      All involved operations are saturating.  */
    121  1.1  mrg   OTI_usmadd_widen,
    122  1.1  mrg   /* Signed multiply and subtract the result and minuend one machine mode
    123  1.1  mrg      wider than the multiplicand and multiplier.  */
    124  1.1  mrg   OTI_smsub_widen,
    125  1.1  mrg   /* Unsigned multiply and subtract the result and minuend one machine mode
    126  1.1  mrg      wider than the multiplicand and multiplier.  */
    127  1.1  mrg   OTI_umsub_widen,
    128  1.1  mrg   /* Signed multiply and subtract the result and minuend one machine mode
    129  1.1  mrg      wider than the multiplicand and multiplier.
    130  1.1  mrg      All involved operations are saturating.  */
    131  1.1  mrg   OTI_ssmsub_widen,
    132  1.1  mrg   /* Unsigned multiply and subtract the result and minuend one machine mode
    133  1.1  mrg      wider than the multiplicand and multiplier.
    134  1.1  mrg      All involved operations are saturating.  */
    135  1.1  mrg   OTI_usmsub_widen,
    136  1.1  mrg 
    137  1.1  mrg   /* Signed divide */
    138  1.1  mrg   OTI_sdiv,
    139  1.1  mrg   OTI_sdivv,
    140  1.1  mrg   /* Signed divide-and-remainder in one */
    141  1.1  mrg   OTI_sdivmod,
    142  1.1  mrg   OTI_udiv,
    143  1.1  mrg   OTI_udivmod,
    144  1.1  mrg   /* Signed remainder */
    145  1.1  mrg   OTI_smod,
    146  1.1  mrg   OTI_umod,
    147  1.1  mrg   /* Floating point remainder functions */
    148  1.1  mrg   OTI_fmod,
    149  1.1  mrg   OTI_remainder,
    150  1.1  mrg   /* Convert float to integer in float fmt */
    151  1.1  mrg   OTI_ftrunc,
    152  1.1  mrg 
    153  1.1  mrg   /* Logical and */
    154  1.1  mrg   OTI_and,
    155  1.1  mrg   /* Logical or */
    156  1.1  mrg   OTI_ior,
    157  1.1  mrg   /* Logical xor */
    158  1.1  mrg   OTI_xor,
    159  1.1  mrg 
    160  1.1  mrg   /* Arithmetic shift left */
    161  1.1  mrg   OTI_ashl,
    162  1.1  mrg   /* Logical shift right */
    163  1.1  mrg   OTI_lshr,
    164  1.1  mrg   /* Arithmetic shift right */
    165  1.1  mrg   OTI_ashr,
    166  1.1  mrg   /* Rotate left */
    167  1.1  mrg   OTI_rotl,
    168  1.1  mrg   /* Rotate right */
    169  1.1  mrg   OTI_rotr,
    170  1.1  mrg 
    171  1.1  mrg   /* Arithmetic shift left of vector by vector */
    172  1.1  mrg   OTI_vashl,
    173  1.1  mrg   /* Logical shift right of vector by vector */
    174  1.1  mrg   OTI_vlshr,
    175  1.1  mrg   /* Arithmetic shift right of vector by vector */
    176  1.1  mrg   OTI_vashr,
    177  1.1  mrg   /* Rotate left of vector by vector */
    178  1.1  mrg   OTI_vrotl,
    179  1.1  mrg   /* Rotate right of vector by vector */
    180  1.1  mrg   OTI_vrotr,
    181  1.1  mrg 
    182  1.1  mrg   /* Signed and floating-point minimum value */
    183  1.1  mrg   OTI_smin,
    184  1.1  mrg   /* Signed and floating-point maximum value */
    185  1.1  mrg   OTI_smax,
    186  1.1  mrg   /* Unsigned minimum value */
    187  1.1  mrg   OTI_umin,
    188  1.1  mrg   /* Unsigned maximum value */
    189  1.1  mrg   OTI_umax,
    190  1.1  mrg   /* Power */
    191  1.1  mrg   OTI_pow,
    192  1.1  mrg   /* Arc tangent of y/x */
    193  1.1  mrg   OTI_atan2,
    194  1.1  mrg 
    195  1.1  mrg   /* Move instruction.  */
    196  1.1  mrg   OTI_mov,
    197  1.1  mrg   /* Move, preserving high part of register.  */
    198  1.1  mrg   OTI_movstrict,
    199  1.1  mrg   /* Move, with a misaligned memory.  */
    200  1.1  mrg   OTI_movmisalign,
    201  1.1  mrg   /* Nontemporal store.  */
    202  1.1  mrg   OTI_storent,
    203  1.1  mrg 
    204  1.1  mrg   /* Unary operations */
    205  1.1  mrg   /* Negation */
    206  1.1  mrg   OTI_neg,
    207  1.1  mrg   OTI_negv,
    208  1.1  mrg   /* Abs value */
    209  1.1  mrg   OTI_abs,
    210  1.1  mrg   OTI_absv,
    211  1.1  mrg   /* Byteswap */
    212  1.1  mrg   OTI_bswap,
    213  1.1  mrg   /* Bitwise not */
    214  1.1  mrg   OTI_one_cmpl,
    215  1.1  mrg   /* Bit scanning and counting */
    216  1.1  mrg   OTI_ffs,
    217  1.1  mrg   OTI_clz,
    218  1.1  mrg   OTI_ctz,
    219  1.1  mrg   OTI_popcount,
    220  1.1  mrg   OTI_parity,
    221  1.1  mrg   /* Square root */
    222  1.1  mrg   OTI_sqrt,
    223  1.1  mrg   /* Sine-Cosine */
    224  1.1  mrg   OTI_sincos,
    225  1.1  mrg   /* Sine */
    226  1.1  mrg   OTI_sin,
    227  1.1  mrg   /* Inverse sine */
    228  1.1  mrg   OTI_asin,
    229  1.1  mrg   /* Cosine */
    230  1.1  mrg   OTI_cos,
    231  1.1  mrg   /* Inverse cosine */
    232  1.1  mrg   OTI_acos,
    233  1.1  mrg   /* Exponential */
    234  1.1  mrg   OTI_exp,
    235  1.1  mrg   /* Base-10 Exponential */
    236  1.1  mrg   OTI_exp10,
    237  1.1  mrg   /* Base-2 Exponential */
    238  1.1  mrg   OTI_exp2,
    239  1.1  mrg   /* Exponential - 1*/
    240  1.1  mrg   OTI_expm1,
    241  1.1  mrg   /* Load exponent of a floating point number */
    242  1.1  mrg   OTI_ldexp,
    243  1.1  mrg   /* Multiply floating-point number by integral power of radix */
    244  1.1  mrg   OTI_scalb,
    245  1.1  mrg   /* Mantissa of a floating-point number */
    246  1.1  mrg   OTI_significand,
    247  1.1  mrg   /* Radix-independent exponent */
    248  1.1  mrg   OTI_logb,
    249  1.1  mrg   OTI_ilogb,
    250  1.1  mrg   /* Natural Logarithm */
    251  1.1  mrg   OTI_log,
    252  1.1  mrg   /* Base-10 Logarithm */
    253  1.1  mrg   OTI_log10,
    254  1.1  mrg   /* Base-2 Logarithm */
    255  1.1  mrg   OTI_log2,
    256  1.1  mrg   /* logarithm of 1 plus argument */
    257  1.1  mrg   OTI_log1p,
    258  1.1  mrg   /* Rounding functions */
    259  1.1  mrg   OTI_floor,
    260  1.1  mrg   OTI_ceil,
    261  1.1  mrg   OTI_btrunc,
    262  1.1  mrg   OTI_round,
    263  1.1  mrg   OTI_nearbyint,
    264  1.1  mrg   OTI_rint,
    265  1.1  mrg   /* Tangent */
    266  1.1  mrg   OTI_tan,
    267  1.1  mrg   /* Inverse tangent */
    268  1.1  mrg   OTI_atan,
    269  1.1  mrg   /* Copy sign */
    270  1.1  mrg   OTI_copysign,
    271  1.1  mrg   /* Signbit */
    272  1.1  mrg   OTI_signbit,
    273  1.1  mrg   /* Test for infinite value */
    274  1.1  mrg   OTI_isinf,
    275  1.1  mrg 
    276  1.1  mrg   /* Compare insn; two operands.  Used only for libcalls.  */
    277  1.1  mrg   OTI_cmp,
    278  1.1  mrg   OTI_ucmp,
    279  1.1  mrg 
    280  1.1  mrg   /* Floating point comparison optabs - used primarily for libfuncs */
    281  1.1  mrg   OTI_eq,
    282  1.1  mrg   OTI_ne,
    283  1.1  mrg   OTI_gt,
    284  1.1  mrg   OTI_ge,
    285  1.1  mrg   OTI_lt,
    286  1.1  mrg   OTI_le,
    287  1.1  mrg   OTI_unord,
    288  1.1  mrg 
    289  1.1  mrg   /* String length */
    290  1.1  mrg   OTI_strlen,
    291  1.1  mrg 
    292  1.1  mrg   /* Combined compare & jump/move/store flags/trap operations.  */
    293  1.1  mrg   OTI_cbranch,
    294  1.1  mrg   OTI_cmov,
    295  1.1  mrg   OTI_cstore,
    296  1.1  mrg   OTI_ctrap,
    297  1.1  mrg 
    298  1.1  mrg   /* Push instruction.  */
    299  1.1  mrg   OTI_push,
    300  1.1  mrg 
    301  1.1  mrg   /* Conditional add instruction.  */
    302  1.1  mrg   OTI_addcc,
    303  1.1  mrg 
    304  1.1  mrg   /* Reduction operations on a vector operand.  */
    305  1.1  mrg   OTI_reduc_smax,
    306  1.1  mrg   OTI_reduc_umax,
    307  1.1  mrg   OTI_reduc_smin,
    308  1.1  mrg   OTI_reduc_umin,
    309  1.1  mrg   OTI_reduc_splus,
    310  1.1  mrg   OTI_reduc_uplus,
    311  1.1  mrg 
    312  1.1  mrg   /* Summation, with result machine mode one or more wider than args.  */
    313  1.1  mrg   OTI_ssum_widen,
    314  1.1  mrg   OTI_usum_widen,
    315  1.1  mrg 
    316  1.1  mrg   /* Dot product, with result machine mode one or more wider than args.  */
    317  1.1  mrg   OTI_sdot_prod,
    318  1.1  mrg   OTI_udot_prod,
    319  1.1  mrg 
    320  1.1  mrg   /* Set specified field of vector operand.  */
    321  1.1  mrg   OTI_vec_set,
    322  1.1  mrg   /* Extract specified field of vector operand.  */
    323  1.1  mrg   OTI_vec_extract,
    324  1.1  mrg   /* Extract even/odd fields of vector operands.  */
    325  1.1  mrg   OTI_vec_extract_even,
    326  1.1  mrg   OTI_vec_extract_odd,
    327  1.1  mrg   /* Interleave fields of vector operands.  */
    328  1.1  mrg   OTI_vec_interleave_high,
    329  1.1  mrg   OTI_vec_interleave_low,
    330  1.1  mrg   /* Initialize vector operand.  */
    331  1.1  mrg   OTI_vec_init,
    332  1.1  mrg   /* Whole vector shift. The shift amount is in bits.  */
    333  1.1  mrg   OTI_vec_shl,
    334  1.1  mrg   OTI_vec_shr,
    335  1.1  mrg   /* Extract specified elements from vectors, for vector load.  */
    336  1.1  mrg   OTI_vec_realign_load,
    337  1.1  mrg   /* Widening multiplication.
    338  1.1  mrg      The high/low part of the resulting vector of products is returned.  */
    339  1.1  mrg   OTI_vec_widen_umult_hi,
    340  1.1  mrg   OTI_vec_widen_umult_lo,
    341  1.1  mrg   OTI_vec_widen_smult_hi,
    342  1.1  mrg   OTI_vec_widen_smult_lo,
    343  1.1  mrg   /* Extract and widen the high/low part of a vector of signed or
    344  1.1  mrg      floating point elements.  */
    345  1.1  mrg   OTI_vec_unpacks_hi,
    346  1.1  mrg   OTI_vec_unpacks_lo,
    347  1.1  mrg   /* Extract and widen the high/low part of a vector of unsigned
    348  1.1  mrg      elements.  */
    349  1.1  mrg   OTI_vec_unpacku_hi,
    350  1.1  mrg   OTI_vec_unpacku_lo,
    351  1.1  mrg 
    352  1.1  mrg   /* Extract, convert to floating point and widen the high/low part of
    353  1.1  mrg      a vector of signed or unsigned integer elements.  */
    354  1.1  mrg   OTI_vec_unpacks_float_hi,
    355  1.1  mrg   OTI_vec_unpacks_float_lo,
    356  1.1  mrg   OTI_vec_unpacku_float_hi,
    357  1.1  mrg   OTI_vec_unpacku_float_lo,
    358  1.1  mrg 
    359  1.1  mrg   /* Narrow (demote) and merge the elements of two vectors.  */
    360  1.1  mrg   OTI_vec_pack_trunc,
    361  1.1  mrg   OTI_vec_pack_usat,
    362  1.1  mrg   OTI_vec_pack_ssat,
    363  1.1  mrg 
    364  1.1  mrg   /* Convert to signed/unsigned integer, narrow and merge elements
    365  1.1  mrg      of two vectors of floating point elements.  */
    366  1.1  mrg   OTI_vec_pack_sfix_trunc,
    367  1.1  mrg   OTI_vec_pack_ufix_trunc,
    368  1.1  mrg 
    369  1.1  mrg   /* Perform a raise to the power of integer.  */
    370  1.1  mrg   OTI_powi,
    371  1.1  mrg 
    372  1.1  mrg   OTI_MAX
    373  1.1  mrg };
    374  1.1  mrg 
    375  1.1  mrg extern struct optab_d optab_table[OTI_MAX];
    376  1.1  mrg 
    377  1.1  mrg #define ssadd_optab (&optab_table[OTI_ssadd])
    378  1.1  mrg #define usadd_optab (&optab_table[OTI_usadd])
    379  1.1  mrg #define sssub_optab (&optab_table[OTI_sssub])
    380  1.1  mrg #define ussub_optab (&optab_table[OTI_ussub])
    381  1.1  mrg #define ssmul_optab (&optab_table[OTI_ssmul])
    382  1.1  mrg #define usmul_optab (&optab_table[OTI_usmul])
    383  1.1  mrg #define ssdiv_optab (&optab_table[OTI_ssdiv])
    384  1.1  mrg #define usdiv_optab (&optab_table[OTI_usdiv])
    385  1.1  mrg #define ssneg_optab (&optab_table[OTI_ssneg])
    386  1.1  mrg #define usneg_optab (&optab_table[OTI_usneg])
    387  1.1  mrg #define ssashl_optab (&optab_table[OTI_ssashl])
    388  1.1  mrg #define usashl_optab (&optab_table[OTI_usashl])
    389  1.1  mrg 
    390  1.1  mrg #define add_optab (&optab_table[OTI_add])
    391  1.1  mrg #define sub_optab (&optab_table[OTI_sub])
    392  1.1  mrg #define smul_optab (&optab_table[OTI_smul])
    393  1.1  mrg #define addv_optab (&optab_table[OTI_addv])
    394  1.1  mrg #define subv_optab (&optab_table[OTI_subv])
    395  1.1  mrg #define smul_highpart_optab (&optab_table[OTI_smul_highpart])
    396  1.1  mrg #define umul_highpart_optab (&optab_table[OTI_umul_highpart])
    397  1.1  mrg #define smul_widen_optab (&optab_table[OTI_smul_widen])
    398  1.1  mrg #define umul_widen_optab (&optab_table[OTI_umul_widen])
    399  1.1  mrg #define usmul_widen_optab (&optab_table[OTI_usmul_widen])
    400  1.1  mrg #define smadd_widen_optab (&optab_table[OTI_smadd_widen])
    401  1.1  mrg #define umadd_widen_optab (&optab_table[OTI_umadd_widen])
    402  1.1  mrg #define ssmadd_widen_optab (&optab_table[OTI_ssmadd_widen])
    403  1.1  mrg #define usmadd_widen_optab (&optab_table[OTI_usmadd_widen])
    404  1.1  mrg #define smsub_widen_optab (&optab_table[OTI_smsub_widen])
    405  1.1  mrg #define umsub_widen_optab (&optab_table[OTI_umsub_widen])
    406  1.1  mrg #define ssmsub_widen_optab (&optab_table[OTI_ssmsub_widen])
    407  1.1  mrg #define usmsub_widen_optab (&optab_table[OTI_usmsub_widen])
    408  1.1  mrg #define sdiv_optab (&optab_table[OTI_sdiv])
    409  1.1  mrg #define smulv_optab (&optab_table[OTI_smulv])
    410  1.1  mrg #define sdivv_optab (&optab_table[OTI_sdivv])
    411  1.1  mrg #define sdivmod_optab (&optab_table[OTI_sdivmod])
    412  1.1  mrg #define udiv_optab (&optab_table[OTI_udiv])
    413  1.1  mrg #define udivmod_optab (&optab_table[OTI_udivmod])
    414  1.1  mrg #define smod_optab (&optab_table[OTI_smod])
    415  1.1  mrg #define umod_optab (&optab_table[OTI_umod])
    416  1.1  mrg #define fmod_optab (&optab_table[OTI_fmod])
    417  1.1  mrg #define remainder_optab (&optab_table[OTI_remainder])
    418  1.1  mrg #define ftrunc_optab (&optab_table[OTI_ftrunc])
    419  1.1  mrg #define and_optab (&optab_table[OTI_and])
    420  1.1  mrg #define ior_optab (&optab_table[OTI_ior])
    421  1.1  mrg #define xor_optab (&optab_table[OTI_xor])
    422  1.1  mrg #define ashl_optab (&optab_table[OTI_ashl])
    423  1.1  mrg #define lshr_optab (&optab_table[OTI_lshr])
    424  1.1  mrg #define ashr_optab (&optab_table[OTI_ashr])
    425  1.1  mrg #define rotl_optab (&optab_table[OTI_rotl])
    426  1.1  mrg #define rotr_optab (&optab_table[OTI_rotr])
    427  1.1  mrg #define vashl_optab (&optab_table[OTI_vashl])
    428  1.1  mrg #define vlshr_optab (&optab_table[OTI_vlshr])
    429  1.1  mrg #define vashr_optab (&optab_table[OTI_vashr])
    430  1.1  mrg #define vrotl_optab (&optab_table[OTI_vrotl])
    431  1.1  mrg #define vrotr_optab (&optab_table[OTI_vrotr])
    432  1.1  mrg #define smin_optab (&optab_table[OTI_smin])
    433  1.1  mrg #define smax_optab (&optab_table[OTI_smax])
    434  1.1  mrg #define umin_optab (&optab_table[OTI_umin])
    435  1.1  mrg #define umax_optab (&optab_table[OTI_umax])
    436  1.1  mrg #define pow_optab (&optab_table[OTI_pow])
    437  1.1  mrg #define atan2_optab (&optab_table[OTI_atan2])
    438  1.1  mrg 
    439  1.1  mrg #define mov_optab (&optab_table[OTI_mov])
    440  1.1  mrg #define movstrict_optab (&optab_table[OTI_movstrict])
    441  1.1  mrg #define movmisalign_optab (&optab_table[OTI_movmisalign])
    442  1.1  mrg #define storent_optab (&optab_table[OTI_storent])
    443  1.1  mrg 
    444  1.1  mrg #define neg_optab (&optab_table[OTI_neg])
    445  1.1  mrg #define negv_optab (&optab_table[OTI_negv])
    446  1.1  mrg #define abs_optab (&optab_table[OTI_abs])
    447  1.1  mrg #define absv_optab (&optab_table[OTI_absv])
    448  1.1  mrg #define one_cmpl_optab (&optab_table[OTI_one_cmpl])
    449  1.1  mrg #define bswap_optab (&optab_table[OTI_bswap])
    450  1.1  mrg #define ffs_optab (&optab_table[OTI_ffs])
    451  1.1  mrg #define clz_optab (&optab_table[OTI_clz])
    452  1.1  mrg #define ctz_optab (&optab_table[OTI_ctz])
    453  1.1  mrg #define popcount_optab (&optab_table[OTI_popcount])
    454  1.1  mrg #define parity_optab (&optab_table[OTI_parity])
    455  1.1  mrg #define sqrt_optab (&optab_table[OTI_sqrt])
    456  1.1  mrg #define sincos_optab (&optab_table[OTI_sincos])
    457  1.1  mrg #define sin_optab (&optab_table[OTI_sin])
    458  1.1  mrg #define asin_optab (&optab_table[OTI_asin])
    459  1.1  mrg #define cos_optab (&optab_table[OTI_cos])
    460  1.1  mrg #define acos_optab (&optab_table[OTI_acos])
    461  1.1  mrg #define exp_optab (&optab_table[OTI_exp])
    462  1.1  mrg #define exp10_optab (&optab_table[OTI_exp10])
    463  1.1  mrg #define exp2_optab (&optab_table[OTI_exp2])
    464  1.1  mrg #define expm1_optab (&optab_table[OTI_expm1])
    465  1.1  mrg #define ldexp_optab (&optab_table[OTI_ldexp])
    466  1.1  mrg #define scalb_optab (&optab_table[OTI_scalb])
    467  1.1  mrg #define significand_optab (&optab_table[OTI_significand])
    468  1.1  mrg #define logb_optab (&optab_table[OTI_logb])
    469  1.1  mrg #define ilogb_optab (&optab_table[OTI_ilogb])
    470  1.1  mrg #define log_optab (&optab_table[OTI_log])
    471  1.1  mrg #define log10_optab (&optab_table[OTI_log10])
    472  1.1  mrg #define log2_optab (&optab_table[OTI_log2])
    473  1.1  mrg #define log1p_optab (&optab_table[OTI_log1p])
    474  1.1  mrg #define floor_optab (&optab_table[OTI_floor])
    475  1.1  mrg #define ceil_optab (&optab_table[OTI_ceil])
    476  1.1  mrg #define btrunc_optab (&optab_table[OTI_btrunc])
    477  1.1  mrg #define round_optab (&optab_table[OTI_round])
    478  1.1  mrg #define nearbyint_optab (&optab_table[OTI_nearbyint])
    479  1.1  mrg #define rint_optab (&optab_table[OTI_rint])
    480  1.1  mrg #define tan_optab (&optab_table[OTI_tan])
    481  1.1  mrg #define atan_optab (&optab_table[OTI_atan])
    482  1.1  mrg #define copysign_optab (&optab_table[OTI_copysign])
    483  1.1  mrg #define signbit_optab (&optab_table[OTI_signbit])
    484  1.1  mrg #define isinf_optab (&optab_table[OTI_isinf])
    485  1.1  mrg 
    486  1.1  mrg #define cmp_optab (&optab_table[OTI_cmp])
    487  1.1  mrg #define ucmp_optab (&optab_table[OTI_ucmp])
    488  1.1  mrg 
    489  1.1  mrg #define eq_optab (&optab_table[OTI_eq])
    490  1.1  mrg #define ne_optab (&optab_table[OTI_ne])
    491  1.1  mrg #define gt_optab (&optab_table[OTI_gt])
    492  1.1  mrg #define ge_optab (&optab_table[OTI_ge])
    493  1.1  mrg #define lt_optab (&optab_table[OTI_lt])
    494  1.1  mrg #define le_optab (&optab_table[OTI_le])
    495  1.1  mrg #define unord_optab (&optab_table[OTI_unord])
    496  1.1  mrg 
    497  1.1  mrg #define strlen_optab (&optab_table[OTI_strlen])
    498  1.1  mrg 
    499  1.1  mrg #define cbranch_optab (&optab_table[OTI_cbranch])
    500  1.1  mrg #define cmov_optab (&optab_table[OTI_cmov])
    501  1.1  mrg #define cstore_optab (&optab_table[OTI_cstore])
    502  1.1  mrg #define ctrap_optab (&optab_table[OTI_ctrap])
    503  1.1  mrg 
    504  1.1  mrg #define push_optab (&optab_table[OTI_push])
    505  1.1  mrg #define addcc_optab (&optab_table[OTI_addcc])
    506  1.1  mrg 
    507  1.1  mrg #define reduc_smax_optab (&optab_table[OTI_reduc_smax])
    508  1.1  mrg #define reduc_umax_optab (&optab_table[OTI_reduc_umax])
    509  1.1  mrg #define reduc_smin_optab (&optab_table[OTI_reduc_smin])
    510  1.1  mrg #define reduc_umin_optab (&optab_table[OTI_reduc_umin])
    511  1.1  mrg #define reduc_splus_optab (&optab_table[OTI_reduc_splus])
    512  1.1  mrg #define reduc_uplus_optab (&optab_table[OTI_reduc_uplus])
    513  1.1  mrg 
    514  1.1  mrg #define ssum_widen_optab (&optab_table[OTI_ssum_widen])
    515  1.1  mrg #define usum_widen_optab (&optab_table[OTI_usum_widen])
    516  1.1  mrg #define sdot_prod_optab (&optab_table[OTI_sdot_prod])
    517  1.1  mrg #define udot_prod_optab (&optab_table[OTI_udot_prod])
    518  1.1  mrg 
    519  1.1  mrg #define vec_set_optab (&optab_table[OTI_vec_set])
    520  1.1  mrg #define vec_extract_optab (&optab_table[OTI_vec_extract])
    521  1.1  mrg #define vec_extract_even_optab (&optab_table[OTI_vec_extract_even])
    522  1.1  mrg #define vec_extract_odd_optab (&optab_table[OTI_vec_extract_odd])
    523  1.1  mrg #define vec_interleave_high_optab (&optab_table[OTI_vec_interleave_high])
    524  1.1  mrg #define vec_interleave_low_optab (&optab_table[OTI_vec_interleave_low])
    525  1.1  mrg #define vec_init_optab (&optab_table[OTI_vec_init])
    526  1.1  mrg #define vec_shl_optab (&optab_table[OTI_vec_shl])
    527  1.1  mrg #define vec_shr_optab (&optab_table[OTI_vec_shr])
    528  1.1  mrg #define vec_realign_load_optab (&optab_table[OTI_vec_realign_load])
    529  1.1  mrg #define vec_widen_umult_hi_optab (&optab_table[OTI_vec_widen_umult_hi])
    530  1.1  mrg #define vec_widen_umult_lo_optab (&optab_table[OTI_vec_widen_umult_lo])
    531  1.1  mrg #define vec_widen_smult_hi_optab (&optab_table[OTI_vec_widen_smult_hi])
    532  1.1  mrg #define vec_widen_smult_lo_optab (&optab_table[OTI_vec_widen_smult_lo])
    533  1.1  mrg #define vec_unpacks_hi_optab (&optab_table[OTI_vec_unpacks_hi])
    534  1.1  mrg #define vec_unpacks_lo_optab (&optab_table[OTI_vec_unpacks_lo])
    535  1.1  mrg #define vec_unpacku_hi_optab (&optab_table[OTI_vec_unpacku_hi])
    536  1.1  mrg #define vec_unpacku_lo_optab (&optab_table[OTI_vec_unpacku_lo])
    537  1.1  mrg #define vec_unpacks_float_hi_optab (&optab_table[OTI_vec_unpacks_float_hi])
    538  1.1  mrg #define vec_unpacks_float_lo_optab (&optab_table[OTI_vec_unpacks_float_lo])
    539  1.1  mrg #define vec_unpacku_float_hi_optab (&optab_table[OTI_vec_unpacku_float_hi])
    540  1.1  mrg #define vec_unpacku_float_lo_optab (&optab_table[OTI_vec_unpacku_float_lo])
    541  1.1  mrg #define vec_pack_trunc_optab (&optab_table[OTI_vec_pack_trunc])
    542  1.1  mrg #define vec_pack_ssat_optab (&optab_table[OTI_vec_pack_ssat])
    543  1.1  mrg #define vec_pack_usat_optab (&optab_table[OTI_vec_pack_usat])
    544  1.1  mrg #define vec_pack_sfix_trunc_optab (&optab_table[OTI_vec_pack_sfix_trunc])
    545  1.1  mrg #define vec_pack_ufix_trunc_optab (&optab_table[OTI_vec_pack_ufix_trunc])
    546  1.1  mrg 
    547  1.1  mrg #define powi_optab (&optab_table[OTI_powi])
    548  1.1  mrg 
    549  1.1  mrg /* Conversion optabs have their own table and indexes.  */
    550  1.1  mrg enum convert_optab_index
    551  1.1  mrg {
    552  1.1  mrg   COI_sext,
    553  1.1  mrg   COI_zext,
    554  1.1  mrg   COI_trunc,
    555  1.1  mrg 
    556  1.1  mrg   COI_sfix,
    557  1.1  mrg   COI_ufix,
    558  1.1  mrg 
    559  1.1  mrg   COI_sfixtrunc,
    560  1.1  mrg   COI_ufixtrunc,
    561  1.1  mrg 
    562  1.1  mrg   COI_sfloat,
    563  1.1  mrg   COI_ufloat,
    564  1.1  mrg 
    565  1.1  mrg   COI_lrint,
    566  1.1  mrg   COI_lround,
    567  1.1  mrg   COI_lfloor,
    568  1.1  mrg   COI_lceil,
    569  1.1  mrg 
    570  1.1  mrg   COI_fract,
    571  1.1  mrg   COI_fractuns,
    572  1.1  mrg   COI_satfract,
    573  1.1  mrg   COI_satfractuns,
    574  1.1  mrg 
    575  1.1  mrg   COI_MAX
    576  1.1  mrg };
    577  1.1  mrg 
    578  1.1  mrg extern struct convert_optab_d convert_optab_table[COI_MAX];
    579  1.1  mrg 
    580  1.1  mrg #define sext_optab (&convert_optab_table[COI_sext])
    581  1.1  mrg #define zext_optab (&convert_optab_table[COI_zext])
    582  1.1  mrg #define trunc_optab (&convert_optab_table[COI_trunc])
    583  1.1  mrg #define sfix_optab (&convert_optab_table[COI_sfix])
    584  1.1  mrg #define ufix_optab (&convert_optab_table[COI_ufix])
    585  1.1  mrg #define sfixtrunc_optab (&convert_optab_table[COI_sfixtrunc])
    586  1.1  mrg #define ufixtrunc_optab (&convert_optab_table[COI_ufixtrunc])
    587  1.1  mrg #define sfloat_optab (&convert_optab_table[COI_sfloat])
    588  1.1  mrg #define ufloat_optab (&convert_optab_table[COI_ufloat])
    589  1.1  mrg #define lrint_optab (&convert_optab_table[COI_lrint])
    590  1.1  mrg #define lround_optab (&convert_optab_table[COI_lround])
    591  1.1  mrg #define lfloor_optab (&convert_optab_table[COI_lfloor])
    592  1.1  mrg #define lceil_optab (&convert_optab_table[COI_lceil])
    593  1.1  mrg #define fract_optab (&convert_optab_table[COI_fract])
    594  1.1  mrg #define fractuns_optab (&convert_optab_table[COI_fractuns])
    595  1.1  mrg #define satfract_optab (&convert_optab_table[COI_satfract])
    596  1.1  mrg #define satfractuns_optab (&convert_optab_table[COI_satfractuns])
    597  1.1  mrg 
    598  1.1  mrg /* These arrays record the insn_code of insns that may be needed to
    599  1.1  mrg    perform input and output reloads of special objects.  They provide a
    600  1.1  mrg    place to pass a scratch register.  */
    601  1.1  mrg extern enum insn_code reload_in_optab[NUM_MACHINE_MODES];
    602  1.1  mrg extern enum insn_code reload_out_optab[NUM_MACHINE_MODES];
    603  1.1  mrg 
    604  1.1  mrg /* Contains the optab used for each rtx code.  */
    605  1.1  mrg extern optab code_to_optab[NUM_RTX_CODE + 1];
    606  1.1  mrg 
    607  1.1  mrg 
    608  1.1  mrg typedef rtx (*rtxfun) (rtx);
    610  1.1  mrg 
    611  1.1  mrg #ifdef HAVE_conditional_move
    612  1.1  mrg /* Indexed by the machine mode, gives the insn code to make a conditional
    613  1.1  mrg    move insn.  */
    614  1.1  mrg 
    615  1.1  mrg extern enum insn_code movcc_gen_code[NUM_MACHINE_MODES];
    616  1.1  mrg #endif
    617  1.1  mrg 
    618  1.1  mrg /* Indexed by the machine mode, gives the insn code for vector conditional
    619  1.1  mrg    operation.  */
    620  1.1  mrg 
    621  1.1  mrg extern enum insn_code vcond_gen_code[NUM_MACHINE_MODES];
    622  1.1  mrg extern enum insn_code vcondu_gen_code[NUM_MACHINE_MODES];
    623  1.1  mrg 
    624  1.1  mrg /* This array records the insn_code of insns to perform block moves.  */
    625  1.1  mrg extern enum insn_code movmem_optab[NUM_MACHINE_MODES];
    626  1.1  mrg 
    627  1.1  mrg /* This array records the insn_code of insns to perform block sets.  */
    628  1.1  mrg extern enum insn_code setmem_optab[NUM_MACHINE_MODES];
    629  1.1  mrg 
    630  1.1  mrg /* These arrays record the insn_code of two different kinds of insns
    631  1.1  mrg    to perform block compares.  */
    632  1.1  mrg extern enum insn_code cmpstr_optab[NUM_MACHINE_MODES];
    633  1.1  mrg extern enum insn_code cmpstrn_optab[NUM_MACHINE_MODES];
    634  1.1  mrg extern enum insn_code cmpmem_optab[NUM_MACHINE_MODES];
    635  1.1  mrg 
    636  1.1  mrg /* Synchronization primitives.  This first set is atomic operation for
    637  1.1  mrg    which we don't care about the resulting value.  */
    638  1.1  mrg extern enum insn_code sync_add_optab[NUM_MACHINE_MODES];
    639  1.1  mrg extern enum insn_code sync_sub_optab[NUM_MACHINE_MODES];
    640  1.1  mrg extern enum insn_code sync_ior_optab[NUM_MACHINE_MODES];
    641  1.1  mrg extern enum insn_code sync_and_optab[NUM_MACHINE_MODES];
    642  1.1  mrg extern enum insn_code sync_xor_optab[NUM_MACHINE_MODES];
    643  1.1  mrg extern enum insn_code sync_nand_optab[NUM_MACHINE_MODES];
    644  1.1  mrg 
    645  1.1  mrg /* This second set is atomic operations in which we return the value
    646  1.1  mrg    that existed in memory before the operation.  */
    647  1.1  mrg extern enum insn_code sync_old_add_optab[NUM_MACHINE_MODES];
    648  1.1  mrg extern enum insn_code sync_old_sub_optab[NUM_MACHINE_MODES];
    649  1.1  mrg extern enum insn_code sync_old_ior_optab[NUM_MACHINE_MODES];
    650  1.1  mrg extern enum insn_code sync_old_and_optab[NUM_MACHINE_MODES];
    651  1.1  mrg extern enum insn_code sync_old_xor_optab[NUM_MACHINE_MODES];
    652  1.1  mrg extern enum insn_code sync_old_nand_optab[NUM_MACHINE_MODES];
    653  1.1  mrg 
    654  1.1  mrg /* This third set is atomic operations in which we return the value
    655  1.1  mrg    that resulted after performing the operation.  */
    656  1.1  mrg extern enum insn_code sync_new_add_optab[NUM_MACHINE_MODES];
    657  1.1  mrg extern enum insn_code sync_new_sub_optab[NUM_MACHINE_MODES];
    658  1.1  mrg extern enum insn_code sync_new_ior_optab[NUM_MACHINE_MODES];
    659  1.1  mrg extern enum insn_code sync_new_and_optab[NUM_MACHINE_MODES];
    660  1.1  mrg extern enum insn_code sync_new_xor_optab[NUM_MACHINE_MODES];
    661  1.1  mrg extern enum insn_code sync_new_nand_optab[NUM_MACHINE_MODES];
    662  1.1  mrg 
    663  1.1  mrg /* Atomic compare and swap.  */
    664  1.1  mrg extern enum insn_code sync_compare_and_swap[NUM_MACHINE_MODES];
    665  1.1  mrg 
    666  1.1  mrg /* Atomic exchange with acquire semantics.  */
    667  1.1  mrg extern enum insn_code sync_lock_test_and_set[NUM_MACHINE_MODES];
    668  1.1  mrg 
    669  1.1  mrg /* Atomic clear with release semantics.  */
    670  1.1  mrg extern enum insn_code sync_lock_release[NUM_MACHINE_MODES];
    671  1.1  mrg 
    672  1.1  mrg /* Define functions given in optabs.c.  */
    673  1.1  mrg 
    674  1.1  mrg extern rtx expand_widen_pattern_expr (sepops ops, rtx op0, rtx op1, rtx wide_op,
    675  1.1  mrg                                       rtx target, int unsignedp);
    676  1.1  mrg 
    677  1.1  mrg extern rtx expand_ternary_op (enum machine_mode mode, optab ternary_optab,
    678  1.1  mrg 			      rtx op0, rtx op1, rtx op2, rtx target,
    679  1.1  mrg 			      int unsignedp);
    680  1.1  mrg 
    681  1.1  mrg /* Expand a binary operation given optab and rtx operands.  */
    682  1.1  mrg extern rtx expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int,
    683  1.1  mrg 			 enum optab_methods);
    684  1.1  mrg 
    685  1.1  mrg extern bool force_expand_binop (enum machine_mode, optab, rtx, rtx, rtx, int,
    686  1.1  mrg 				enum optab_methods);
    687  1.1  mrg 
    688  1.1  mrg /* Expand a binary operation with both signed and unsigned forms.  */
    689  1.1  mrg extern rtx sign_expand_binop (enum machine_mode, optab, optab, rtx, rtx,
    690  1.1  mrg 			      rtx, int, enum optab_methods);
    691  1.1  mrg 
    692  1.1  mrg /* Generate code to perform an operation on one operand with two results.  */
    693  1.1  mrg extern int expand_twoval_unop (optab, rtx, rtx, rtx, int);
    694  1.1  mrg 
    695  1.1  mrg /* Generate code to perform an operation on two operands with two results.  */
    696  1.1  mrg extern int expand_twoval_binop (optab, rtx, rtx, rtx, rtx, int);
    697  1.1  mrg 
    698  1.1  mrg /* Generate code to perform an operation on two operands with two
    699  1.1  mrg    results, using a library function.  */
    700  1.1  mrg extern bool expand_twoval_binop_libfunc (optab, rtx, rtx, rtx, rtx,
    701  1.1  mrg 					 enum rtx_code);
    702  1.1  mrg 
    703  1.1  mrg /* Expand a unary arithmetic operation given optab rtx operand.  */
    704  1.1  mrg extern rtx expand_unop (enum machine_mode, optab, rtx, rtx, int);
    705  1.1  mrg 
    706  1.1  mrg /* Expand the absolute value operation.  */
    707  1.1  mrg extern rtx expand_abs_nojump (enum machine_mode, rtx, rtx, int);
    708  1.1  mrg extern rtx expand_abs (enum machine_mode, rtx, rtx, int, int);
    709  1.1  mrg 
    710  1.1  mrg /* Expand the one's complement absolute value operation.  */
    711  1.1  mrg extern rtx expand_one_cmpl_abs_nojump (enum machine_mode, rtx, rtx);
    712  1.1  mrg 
    713  1.1  mrg /* Expand the copysign operation.  */
    714  1.1  mrg extern rtx expand_copysign (rtx, rtx, rtx);
    715  1.1  mrg 
    716  1.1  mrg /* Generate an instruction with a given INSN_CODE with an output and
    717  1.1  mrg    an input.  */
    718  1.1  mrg extern void emit_unop_insn (int, rtx, rtx, enum rtx_code);
    719  1.1  mrg extern bool maybe_emit_unop_insn (int, rtx, rtx, enum rtx_code);
    720  1.1  mrg 
    721  1.1  mrg /* An extra flag to control optab_for_tree_code's behavior.  This is needed to
    722  1.1  mrg    distinguish between machines with a vector shift that takes a scalar for the
    723  1.1  mrg    shift amount vs. machines that take a vector for the shift amount.  */
    724  1.1  mrg enum optab_subtype
    725  1.1  mrg {
    726  1.1  mrg   optab_default,
    727  1.1  mrg   optab_scalar,
    728  1.1  mrg   optab_vector
    729  1.1  mrg };
    730  1.1  mrg 
    731  1.1  mrg /* Return the optab used for computing the given operation on the type given by
    732  1.1  mrg    the second argument.  The third argument distinguishes between the types of
    733  1.1  mrg    vector shifts and rotates */
    734  1.1  mrg extern optab optab_for_tree_code (enum tree_code, const_tree, enum optab_subtype);
    735  1.1  mrg 
    736  1.1  mrg /* The various uses that a comparison can have; used by can_compare_p:
    737  1.1  mrg    jumps, conditional moves, store flag operations.  */
    738  1.1  mrg enum can_compare_purpose
    739  1.1  mrg {
    740  1.1  mrg   ccp_jump,
    741  1.1  mrg   ccp_cmov,
    742  1.1  mrg   ccp_store_flag
    743  1.1  mrg };
    744  1.1  mrg 
    745  1.1  mrg /* Nonzero if a compare of mode MODE can be done straightforwardly
    746  1.1  mrg    (without splitting it into pieces).  */
    747  1.1  mrg extern int can_compare_p (enum rtx_code, enum machine_mode,
    748  1.1  mrg 			  enum can_compare_purpose);
    749  1.1  mrg 
    750  1.1  mrg /* Return the INSN_CODE to use for an extend operation.  */
    751  1.1  mrg extern enum insn_code can_extend_p (enum machine_mode, enum machine_mode, int);
    752  1.1  mrg 
    753  1.1  mrg /* Generate the body of an insn to extend Y (with mode MFROM)
    754  1.1  mrg    into X (with mode MTO).  Do zero-extension if UNSIGNEDP is nonzero.  */
    755  1.1  mrg extern rtx gen_extend_insn (rtx, rtx, enum machine_mode,
    756  1.1  mrg 			    enum machine_mode, int);
    757  1.1  mrg 
    758  1.1  mrg /* Call this to reset the function entry for one optab.  */
    759  1.1  mrg extern void set_optab_libfunc (optab, enum machine_mode, const char *);
    760  1.1  mrg extern void set_conv_libfunc (convert_optab, enum machine_mode,
    761  1.1  mrg 			      enum machine_mode, const char *);
    762  1.1  mrg 
    763  1.1  mrg /* Generate code for a FIXED_CONVERT_EXPR.  */
    764  1.1  mrg extern void expand_fixed_convert (rtx, rtx, int, int);
    765  1.1  mrg 
    766  1.1  mrg /* Generate code for a FLOAT_EXPR.  */
    767  1.1  mrg extern void expand_float (rtx, rtx, int);
    768  1.1  mrg 
    769  1.1  mrg /* Generate code for a FIX_EXPR.  */
    770  1.1  mrg extern void expand_fix (rtx, rtx, int);
    771  1.1  mrg 
    772  1.1  mrg /* Generate code for float to integral conversion.  */
    773  1.1  mrg extern bool expand_sfix_optab (rtx, rtx, convert_optab);
    774  1.1  mrg 
    775  1.1  mrg /* Return tree if target supports vector operations for COND_EXPR.  */
    776  1.1  mrg bool expand_vec_cond_expr_p (tree, enum machine_mode);
    777  1.1  mrg 
    778  1.1  mrg /* Generate code for VEC_COND_EXPR.  */
    779  1.1  mrg extern rtx expand_vec_cond_expr (tree, tree, tree, tree, rtx);
    780  1.1  mrg /* Generate code for VEC_LSHIFT_EXPR and VEC_RSHIFT_EXPR.  */
    781  1.1  mrg extern rtx expand_vec_shift_expr (sepops, rtx);
    782  1.1  mrg 
    783  1.1  mrg #define optab_handler(optab,mode) (&(optab)->handlers[(int) (mode)])
    784  1.1  mrg #define convert_optab_handler(optab,mode,mode2) \
    785  1.1  mrg 	(&(optab)->handlers[(int) (mode)][(int) (mode2)])
    786  1.1  mrg 
    787  1.1  mrg extern rtx optab_libfunc (optab optab, enum machine_mode mode);
    788  1.1  mrg extern rtx convert_optab_libfunc (convert_optab optab, enum machine_mode mode1,
    789  1.1  mrg 			          enum machine_mode mode2);
    790           #endif /* GCC_OPTABS_H */
    791