Home | History | Annotate | Line # | Download | only in ia64
div.md revision 1.1
      1  1.1  mrg ;; Copyright (C) 2007, 2008, 2009 Free Software Foundation, Inc.
      2  1.1  mrg ;;
      3  1.1  mrg ;; This file is part of GCC.
      4  1.1  mrg ;;
      5  1.1  mrg ;; GCC is free software; you can redistribute it and/or modify
      6  1.1  mrg ;; it under the terms of the GNU General Public License as published by
      7  1.1  mrg ;; the Free Software Foundation; either version 3, or (at your option)
      8  1.1  mrg ;; any later version.
      9  1.1  mrg ;;
     10  1.1  mrg ;; GCC is distributed in the hope that it will be useful,
     11  1.1  mrg ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  1.1  mrg ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     13  1.1  mrg ;; GNU General Public License for more details.
     14  1.1  mrg ;;
     15  1.1  mrg ;; You should have received a copy of the GNU General Public License
     16  1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     17  1.1  mrg ;; <http://www.gnu.org/licenses/>.
     18  1.1  mrg 
     19  1.1  mrg ;; For the internal conditional math routines:
     20  1.1  mrg 
     21  1.1  mrg ;; operand 0 is always the result
     22  1.1  mrg ;; operand 1 is always the predicate
     23  1.1  mrg ;; operand 2, 3, and sometimes 4 are the input values.
     24  1.1  mrg ;; operand 4 or 5 is the floating point status register to use.
     25  1.1  mrg ;; operand 5 or 6 is the rounding to do. (0 = single, 1 = double, 2 = none)
     26  1.1  mrg ;;
     27  1.1  mrg ;; addrf3_cond   - F0 = F2 + F3
     28  1.1  mrg ;; subrf3_cond   - F0 = F2 - F3
     29  1.1  mrg ;; mulrf3_cond   - F0 = F2 * F3
     30  1.1  mrg ;; nmulrf3_cond  - F0 = - (F2 * F3)
     31  1.1  mrg ;; m1addrf4_cond - F0 = (F2 * F3) + F4
     32  1.1  mrg ;; m1subrf4_cond - F0 = (F2 * F3) - F4
     33  1.1  mrg ;; m2addrf4_cond - F0 = F2 + (F3 * F4)
     34  1.1  mrg ;; m2subrf4_cond - F0 = F2 - (F3 * F4)
     35  1.1  mrg 
     36  1.1  mrg ;; Basic plus/minus/mult operations
     37  1.1  mrg 
     38  1.1  mrg (define_insn "addrf3_cond"
     39  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
     40  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
     41  1.1  mrg                                 (const_int 0))
     42  1.1  mrg           (plus:RF
     43  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
     44  1.1  mrg             (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG"))
     45  1.1  mrg           (match_operand:RF 4 "fr_reg_or_0_operand" "0,H")))
     46  1.1  mrg    (use (match_operand:SI 5 "const_int_operand" ""))
     47  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))]
     48  1.1  mrg   ""
     49  1.1  mrg   "(%1) fadd%R6.s%5 %0 = %F2, %F3"
     50  1.1  mrg   [(set_attr "itanium_class" "fmac")
     51  1.1  mrg    (set_attr "predicable" "no")])
     52  1.1  mrg 
     53  1.1  mrg (define_insn "subrf3_cond"
     54  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
     55  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
     56  1.1  mrg                                 (const_int 0))
     57  1.1  mrg           (minus:RF
     58  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
     59  1.1  mrg             (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG"))
     60  1.1  mrg           (match_operand:RF 4 "fr_reg_or_0_operand" "0,H")))
     61  1.1  mrg    (use (match_operand:SI 5 "const_int_operand" ""))
     62  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))]
     63  1.1  mrg   ""
     64  1.1  mrg   "(%1) fsub%R6.s%5 %0 = %F2, %F3"
     65  1.1  mrg   [(set_attr "itanium_class" "fmac")
     66  1.1  mrg    (set_attr "predicable" "no")])
     67  1.1  mrg 
     68  1.1  mrg (define_insn "mulrf3_cond"
     69  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
     70  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
     71  1.1  mrg                                 (const_int 0))
     72  1.1  mrg           (mult:RF
     73  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
     74  1.1  mrg             (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG"))
     75  1.1  mrg           (match_operand:RF 4 "fr_reg_or_0_operand" "0,H")))
     76  1.1  mrg    (use (match_operand:SI 5 "const_int_operand" ""))
     77  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))]
     78  1.1  mrg   ""
     79  1.1  mrg   "(%1) fmpy%R6.s%5 %0 = %F2, %F3"
     80  1.1  mrg   [(set_attr "itanium_class" "fmac")
     81  1.1  mrg    (set_attr "predicable" "no")])
     82  1.1  mrg 
     83  1.1  mrg ;; neg-mult operation
     84  1.1  mrg 
     85  1.1  mrg (define_insn "nmulrf3_cond"
     86  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
     87  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
     88  1.1  mrg                                 (const_int 0))
     89  1.1  mrg           (neg:RF (mult:RF
     90  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
     91  1.1  mrg             (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG")))
     92  1.1  mrg           (match_operand:RF 4 "fr_reg_or_0_operand" "0,H")))
     93  1.1  mrg    (use (match_operand:SI 5 "const_int_operand" ""))
     94  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))]
     95  1.1  mrg   ""
     96  1.1  mrg   "(%1) fnmpy%R6.s%5 %0 = %F2, %F3"
     97  1.1  mrg   [(set_attr "itanium_class" "fmac")
     98  1.1  mrg    (set_attr "predicable" "no")])
     99  1.1  mrg 
    100  1.1  mrg ;; add-mult/sub-mult operations (mult as op1)
    101  1.1  mrg 
    102  1.1  mrg (define_insn "m1addrf4_cond"
    103  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
    104  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
    105  1.1  mrg                                 (const_int 0))
    106  1.1  mrg           (plus:RF
    107  1.1  mrg             (mult:RF
    108  1.1  mrg               (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
    109  1.1  mrg               (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG"))
    110  1.1  mrg             (match_operand:RF 4 "fr_reg_or_fp01_operand" "fG,fG"))
    111  1.1  mrg           (match_operand:RF 5 "fr_reg_or_0_operand" "0,H")))
    112  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))
    113  1.1  mrg    (use (match_operand:SI 7 "const_int_operand" ""))]
    114  1.1  mrg   ""
    115  1.1  mrg   "(%1) fma%R7.s%6 %0 = %F2, %F3, %F4"
    116  1.1  mrg   [(set_attr "itanium_class" "fmac")
    117  1.1  mrg    (set_attr "predicable" "no")])
    118  1.1  mrg 
    119  1.1  mrg (define_insn "m1subrf4_cond"
    120  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
    121  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
    122  1.1  mrg                                 (const_int 0))
    123  1.1  mrg           (minus:RF
    124  1.1  mrg             (mult:RF
    125  1.1  mrg               (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
    126  1.1  mrg               (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG"))
    127  1.1  mrg             (match_operand:RF 4 "fr_reg_or_fp01_operand" "fG,fG"))
    128  1.1  mrg           (match_operand:RF 5 "fr_reg_or_0_operand" "0,H")))
    129  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))
    130  1.1  mrg    (use (match_operand:SI 7 "const_int_operand" ""))]
    131  1.1  mrg   ""
    132  1.1  mrg   "(%1) fms%R7.s%6 %0 = %F2, %F3, %F4"
    133  1.1  mrg   [(set_attr "itanium_class" "fmac")
    134  1.1  mrg    (set_attr "predicable" "no")])
    135  1.1  mrg 
    136  1.1  mrg ;; add-mult/sub-mult operations (mult as op2)
    137  1.1  mrg 
    138  1.1  mrg (define_insn "m2addrf4_cond"
    139  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
    140  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
    141  1.1  mrg                                 (const_int 0))
    142  1.1  mrg           (plus:RF
    143  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
    144  1.1  mrg             (mult:RF
    145  1.1  mrg               (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG")
    146  1.1  mrg               (match_operand:RF 4 "fr_reg_or_fp01_operand" "fG,fG")))
    147  1.1  mrg           (match_operand:RF 5 "fr_reg_or_0_operand" "0,H")))
    148  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))
    149  1.1  mrg    (use (match_operand:SI 7 "const_int_operand" ""))]
    150  1.1  mrg   ""
    151  1.1  mrg   "(%1) fma%R7.s%6 %0 = %F3, %F4, %F2"
    152  1.1  mrg   [(set_attr "itanium_class" "fmac")
    153  1.1  mrg    (set_attr "predicable" "no")])
    154  1.1  mrg 
    155  1.1  mrg (define_insn "m2subrf4_cond"
    156  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f,f")
    157  1.1  mrg         (if_then_else:RF (ne:RF (match_operand:BI 1 "register_operand"  "c,c")
    158  1.1  mrg                                 (const_int 0))
    159  1.1  mrg           (minus:RF
    160  1.1  mrg             (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG,fG")
    161  1.1  mrg             (mult:RF
    162  1.1  mrg               (match_operand:RF 3 "fr_reg_or_fp01_operand" "fG,fG")
    163  1.1  mrg               (match_operand:RF 4 "fr_reg_or_fp01_operand" "fG,fG")))
    164  1.1  mrg           (match_operand:RF 5 "fr_reg_or_0_operand" "0,H")))
    165  1.1  mrg    (use (match_operand:SI 6 "const_int_operand" ""))
    166  1.1  mrg    (use (match_operand:SI 7 "const_int_operand" ""))]
    167  1.1  mrg   ""
    168  1.1  mrg   "(%1) fnma%R7.s%6 %0 = %F3, %F4, %F2"
    169  1.1  mrg   [(set_attr "itanium_class" "fmac")
    170  1.1  mrg    (set_attr "predicable" "no")])
    171  1.1  mrg 
    172  1.1  mrg ;; Conversions to/from RF and SF/DF/XF
    173  1.1  mrg ;; These conversions should not generate any code but make it possible
    174  1.1  mrg ;; for all the instructions used to implement floating point division
    175  1.1  mrg ;; to be written for RFmode only and to not have to handle multiple
    176  1.1  mrg ;; modes or to have to handle a register in more than one mode.
    177  1.1  mrg 
    178  1.1  mrg (define_mode_iterator SDX_F [SF DF XF])
    179  1.1  mrg 
    180  1.1  mrg (define_insn "extend<mode>rf2"
    181  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f")
    182  1.1  mrg         (float_extend:RF (match_operand:SDX_F 1 "fr_reg_or_fp01_operand" "fG")))]
    183  1.1  mrg   ""
    184  1.1  mrg   "#"
    185  1.1  mrg   [(set_attr "itanium_class" "fmisc")
    186  1.1  mrg    (set_attr "predicable" "yes")])
    187  1.1  mrg 
    188  1.1  mrg (define_split
    189  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "")
    190  1.1  mrg         (float_extend:RF (match_operand:SDX_F 1 "fr_reg_or_fp01_operand" "")))]
    191  1.1  mrg    "reload_completed"
    192  1.1  mrg    [(set (match_dup 0) (match_dup 2))]
    193  1.1  mrg {
    194  1.1  mrg    if (operands[1] == CONST0_RTX (<MODE>mode))
    195  1.1  mrg      operands[2] = gen_rtx_REG (RFmode, FR_REG (0));
    196  1.1  mrg    else if (operands[1] == CONST1_RTX (<MODE>mode))
    197  1.1  mrg      operands[2] = gen_rtx_REG (RFmode, FR_REG (1));
    198  1.1  mrg    else
    199  1.1  mrg      operands[2] = gen_rtx_REG (RFmode, REGNO (operands[1]));
    200  1.1  mrg })
    201  1.1  mrg 
    202  1.1  mrg 
    203  1.1  mrg (define_insn "truncrf<mode>2"
    204  1.1  mrg   [(set (match_operand:SDX_F 0 "fr_register_operand" "=f")
    205  1.1  mrg         (float_truncate:SDX_F (match_operand:RF 1 "fr_reg_or_fp01_operand" "fG")))]
    206  1.1  mrg   ""
    207  1.1  mrg   "#"
    208  1.1  mrg   [(set_attr "itanium_class" "fmisc")
    209  1.1  mrg    (set_attr "predicable" "yes")])
    210  1.1  mrg 
    211  1.1  mrg (define_split
    212  1.1  mrg   [(set (match_operand:SDX_F 0 "fr_register_operand" "")
    213  1.1  mrg         (float_truncate:SDX_F (match_operand:RF 1 "fr_reg_or_fp01_operand" "")))]
    214  1.1  mrg    "reload_completed"
    215  1.1  mrg    [(set (match_dup 0) (match_dup 2))]
    216  1.1  mrg {
    217  1.1  mrg    if (operands[1] == CONST0_RTX (RFmode))
    218  1.1  mrg      operands[2] = gen_rtx_REG (<MODE>mode, FR_REG (0));
    219  1.1  mrg    else if (operands[1] == CONST1_RTX (RFmode))
    220  1.1  mrg      operands[2] = gen_rtx_REG (<MODE>mode, FR_REG (1));
    221  1.1  mrg    else
    222  1.1  mrg      operands[2] = gen_rtx_REG (<MODE>mode, REGNO (operands[1]));
    223  1.1  mrg })
    224  1.1  mrg 
    225  1.1  mrg ;; Float to integer truncations using an alternative status register. 
    226  1.1  mrg 
    227  1.1  mrg (define_insn "fix_truncrfdi2_alts"
    228  1.1  mrg   [(set (match_operand:DI 0 "fr_register_operand" "=f")
    229  1.1  mrg         (fix:DI (match_operand:RF 1 "fr_register_operand" "f")))
    230  1.1  mrg    (use (match_operand:SI 2 "const_int_operand" ""))]
    231  1.1  mrg   ""
    232  1.1  mrg   "fcvt.fx.trunc.s%2 %0 = %1"
    233  1.1  mrg   [(set_attr "itanium_class" "fcvtfx")])
    234  1.1  mrg 
    235  1.1  mrg (define_insn "fixuns_truncrfdi2_alts"
    236  1.1  mrg   [(set (match_operand:DI 0 "fr_register_operand" "=f")
    237  1.1  mrg         (unsigned_fix:DI (match_operand:RF 1 "fr_register_operand" "f")))
    238  1.1  mrg    (use (match_operand:SI 2 "const_int_operand" ""))]
    239  1.1  mrg   ""
    240  1.1  mrg   "fcvt.fxu.trunc.s%2 %0 = %1"
    241  1.1  mrg   [(set_attr "itanium_class" "fcvtfx")])
    242  1.1  mrg 
    243  1.1  mrg (define_insn "setf_exp_rf"
    244  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f")
    245  1.1  mrg         (unspec:RF [(match_operand:DI 1 "register_operand" "r")]
    246  1.1  mrg                   UNSPEC_SETF_EXP))]
    247  1.1  mrg   ""
    248  1.1  mrg   "setf.exp %0 = %1"
    249  1.1  mrg   [(set_attr "itanium_class" "frfr")])
    250  1.1  mrg 
    251  1.1  mrg ;; Reciprocal approximation
    252  1.1  mrg 
    253  1.1  mrg (define_insn "recip_approx_rf"
    254  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f")
    255  1.1  mrg         (unspec:RF [(match_operand:RF 1 "fr_reg_or_fp01_operand" "fG")
    256  1.1  mrg 		    (match_operand:RF 2 "fr_reg_or_fp01_operand" "fG")]
    257  1.1  mrg 		   UNSPEC_FR_RECIP_APPROX_RES))
    258  1.1  mrg    (set (match_operand:BI 3 "register_operand" "=c")
    259  1.1  mrg         (unspec:BI [(match_dup 1) (match_dup 2)] UNSPEC_FR_RECIP_APPROX))
    260  1.1  mrg    (use (match_operand:SI 4 "const_int_operand" ""))]
    261  1.1  mrg   ""
    262  1.1  mrg   "frcpa.s%4 %0, %3 = %F1, %F2"
    263  1.1  mrg   [(set_attr "itanium_class" "fmisc")
    264  1.1  mrg    (set_attr "predicable" "no")])
    265  1.1  mrg 
    266  1.1  mrg ;; Single precision floating point division
    267  1.1  mrg 
    268  1.1  mrg (define_expand "divsf3"
    269  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "")
    270  1.1  mrg 	(div:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "")
    271  1.1  mrg 		(match_operand:SF 2 "fr_reg_or_fp01_operand" "")))]
    272  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    273  1.1  mrg {
    274  1.1  mrg   rtx insn;
    275  1.1  mrg   if (TARGET_INLINE_FLOAT_DIV == INL_MIN_LAT)
    276  1.1  mrg     insn = gen_divsf3_internal_lat (operands[0], operands[1], operands[2]);
    277  1.1  mrg   else
    278  1.1  mrg     insn = gen_divsf3_internal_thr (operands[0], operands[1], operands[2]);
    279  1.1  mrg   emit_insn (insn);
    280  1.1  mrg   DONE;
    281  1.1  mrg })
    282  1.1  mrg 
    283  1.1  mrg ;; Single precision floating point division (maximum throughput algorithm).
    284  1.1  mrg 
    285  1.1  mrg (define_expand "divsf3_internal_thr"
    286  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "")
    287  1.1  mrg         (div:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "")
    288  1.1  mrg                 (match_operand:SF 2 "fr_reg_or_fp01_operand" "")))]
    289  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    290  1.1  mrg {
    291  1.1  mrg   rtx y     = gen_reg_rtx (RFmode);
    292  1.1  mrg   rtx a     = gen_reg_rtx (RFmode);
    293  1.1  mrg   rtx b     = gen_reg_rtx (RFmode);
    294  1.1  mrg   rtx e     = gen_reg_rtx (RFmode);
    295  1.1  mrg   rtx y1    = gen_reg_rtx (RFmode);
    296  1.1  mrg   rtx y2    = gen_reg_rtx (RFmode);
    297  1.1  mrg   rtx q     = gen_reg_rtx (RFmode);
    298  1.1  mrg   rtx r     = gen_reg_rtx (RFmode);
    299  1.1  mrg   rtx q_res = gen_reg_rtx (RFmode);
    300  1.1  mrg   rtx cond  = gen_reg_rtx (BImode);
    301  1.1  mrg   rtx zero    = CONST0_RTX (RFmode);
    302  1.1  mrg   rtx one     = CONST1_RTX (RFmode);
    303  1.1  mrg   rtx status0 = CONST0_RTX (SImode);
    304  1.1  mrg   rtx status1 = CONST1_RTX (SImode);
    305  1.1  mrg   rtx trunc_sgl = CONST0_RTX (SImode);
    306  1.1  mrg   rtx trunc_off    = CONST2_RTX (SImode);
    307  1.1  mrg 
    308  1.1  mrg   /* Empty conversions to put inputs into RFmode.  */
    309  1.1  mrg   emit_insn (gen_extendsfrf2 (a, operands[1]));
    310  1.1  mrg   emit_insn (gen_extendsfrf2 (b, operands[2]));
    311  1.1  mrg   /* y = 1 / b				*/
    312  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status0));
    313  1.1  mrg   /* e = 1 - (b * y)			*/
    314  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    315  1.1  mrg   /* y1 = y + (y * e)			*/
    316  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e, zero, status1, trunc_off));
    317  1.1  mrg   /* y2 = y + (y1 * e)			*/
    318  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y, y1, e, zero, status1, trunc_off));
    319  1.1  mrg   /* q = single(a * y2)			*/
    320  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y2, zero, status1, trunc_sgl));
    321  1.1  mrg   /* r = a - (q * b)			*/
    322  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, q, b, zero, status1, trunc_off));
    323  1.1  mrg   /* Q = single (q + (r * y2))		*/
    324  1.1  mrg   emit_insn (gen_m2addrf4_cond (q_res, cond, q, r, y2, y, status0, trunc_sgl));
    325  1.1  mrg   /* Conversion back into SFmode.	*/
    326  1.1  mrg   emit_insn (gen_truncrfsf2 (operands[0], q_res));
    327  1.1  mrg   DONE;
    328  1.1  mrg })
    329  1.1  mrg 
    330  1.1  mrg ;; Single precision floating point division (minimum latency algorithm).
    331  1.1  mrg 
    332  1.1  mrg (define_expand "divsf3_internal_lat"
    333  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "")
    334  1.1  mrg         (div:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "")
    335  1.1  mrg                 (match_operand:SF 2 "fr_reg_or_fp01_operand" "")))]
    336  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    337  1.1  mrg {
    338  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    339  1.1  mrg   rtx a         = gen_reg_rtx (RFmode);
    340  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
    341  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    342  1.1  mrg   rtx q         = gen_reg_rtx (RFmode);
    343  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    344  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    345  1.1  mrg   rtx q1        = gen_reg_rtx (RFmode);
    346  1.1  mrg   rtx r         = gen_reg_rtx (RFmode);
    347  1.1  mrg   rtx q_res     = gen_reg_rtx (RFmode);
    348  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    349  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    350  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    351  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
    352  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    353  1.1  mrg   rtx trunc_sgl = CONST0_RTX (SImode);
    354  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    355  1.1  mrg 
    356  1.1  mrg   /* Empty conversions to put inputs into RFmode.  */
    357  1.1  mrg   emit_insn (gen_extendsfrf2 (a, operands[1]));
    358  1.1  mrg   emit_insn (gen_extendsfrf2 (b, operands[2]));
    359  1.1  mrg   /* y = 1 / b				*/
    360  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status0));
    361  1.1  mrg   /* q = a * y				*/
    362  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y, zero, status1, trunc_off));
    363  1.1  mrg   /* e = 1 - (b * y)			*/
    364  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    365  1.1  mrg   /* e1 = e + (e * e)			*/
    366  1.1  mrg   emit_insn (gen_m2addrf4_cond (e1, cond, e, e, e, zero, status1, trunc_off));
    367  1.1  mrg   /* q1 = single(q + (q * e1))		*/
    368  1.1  mrg   emit_insn (gen_m2addrf4_cond (q1, cond, q, q, e1, zero, status1, trunc_sgl));
    369  1.1  mrg   /* y1 = y + (y * e1)			*/
    370  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e1, zero, status1, trunc_off));
    371  1.1  mrg   /* r = a - (q1 * b)			*/
    372  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, q1, b, zero, status1, trunc_off));
    373  1.1  mrg   /* Q = single (q1 + (r * y1))		*/
    374  1.1  mrg   emit_insn (gen_m2addrf4_cond (q_res, cond, q1, r, y1, y, status0, trunc_sgl));
    375  1.1  mrg   /* Conversion back into SFmode.	*/
    376  1.1  mrg   emit_insn (gen_truncrfsf2 (operands[0], q_res));
    377  1.1  mrg   DONE;
    378  1.1  mrg })
    379  1.1  mrg 
    380  1.1  mrg ;; Double precision floating point division
    381  1.1  mrg 
    382  1.1  mrg (define_expand "divdf3"
    383  1.1  mrg   [(set (match_operand:DF 0 "fr_register_operand" "")
    384  1.1  mrg 	(div:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "")
    385  1.1  mrg 		(match_operand:DF 2 "fr_reg_or_fp01_operand" "")))]
    386  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    387  1.1  mrg {
    388  1.1  mrg   rtx insn;
    389  1.1  mrg   if (TARGET_INLINE_FLOAT_DIV == INL_MIN_LAT)
    390  1.1  mrg     insn = gen_divdf3_internal_lat (operands[0], operands[1], operands[2]);
    391  1.1  mrg   else
    392  1.1  mrg     insn = gen_divdf3_internal_thr (operands[0], operands[1], operands[2]);
    393  1.1  mrg   emit_insn (insn);
    394  1.1  mrg   DONE;
    395  1.1  mrg })
    396  1.1  mrg 
    397  1.1  mrg ;; Double precision floating point division (maximum throughput algorithm).
    398  1.1  mrg 
    399  1.1  mrg (define_expand "divdf3_internal_thr"
    400  1.1  mrg   [(set (match_operand:DF 0 "fr_register_operand" "")
    401  1.1  mrg         (div:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "")
    402  1.1  mrg                 (match_operand:DF 2 "fr_reg_or_fp01_operand" "")))]
    403  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    404  1.1  mrg {
    405  1.1  mrg   rtx q_res = gen_reg_rtx (RFmode);
    406  1.1  mrg   rtx a     = gen_reg_rtx (RFmode);
    407  1.1  mrg   rtx b     = gen_reg_rtx (RFmode);
    408  1.1  mrg   rtx y     = gen_reg_rtx (RFmode);
    409  1.1  mrg   rtx e     = gen_reg_rtx (RFmode);
    410  1.1  mrg   rtx y1    = gen_reg_rtx (RFmode);
    411  1.1  mrg   rtx e1    = gen_reg_rtx (RFmode);
    412  1.1  mrg   rtx y2    = gen_reg_rtx (RFmode);
    413  1.1  mrg   rtx e2    = gen_reg_rtx (RFmode);
    414  1.1  mrg   rtx y3    = gen_reg_rtx (RFmode);
    415  1.1  mrg   rtx q     = gen_reg_rtx (RFmode);
    416  1.1  mrg   rtx r     = gen_reg_rtx (RFmode);
    417  1.1  mrg   rtx cond  = gen_reg_rtx (BImode);
    418  1.1  mrg   rtx zero    = CONST0_RTX (RFmode);
    419  1.1  mrg   rtx one     = CONST1_RTX (RFmode);
    420  1.1  mrg   rtx status0 = CONST0_RTX (SImode);
    421  1.1  mrg   rtx status1 = CONST1_RTX (SImode);
    422  1.1  mrg   rtx trunc_dbl = CONST1_RTX (SImode);
    423  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    424  1.1  mrg   /* Empty conversions to put inputs into RFmode */
    425  1.1  mrg   emit_insn (gen_extenddfrf2 (a, operands[1]));
    426  1.1  mrg   emit_insn (gen_extenddfrf2 (b, operands[2]));
    427  1.1  mrg   /* y  = 1 / b			*/
    428  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status0));
    429  1.1  mrg   /* e  = 1 - (b * y)		*/
    430  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    431  1.1  mrg   /* y1 = y + (y * e)		*/
    432  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e, zero, status1, trunc_off));
    433  1.1  mrg   /* e1 = e * e			*/
    434  1.1  mrg   emit_insn (gen_mulrf3_cond (e1, cond, e, e, zero, status1, trunc_off));
    435  1.1  mrg   /* y2 = y1 + (y1 * e1)	*/
    436  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y1, y1, e1, zero, status1, trunc_off));
    437  1.1  mrg   /* e2 = e1 * e1		*/
    438  1.1  mrg   emit_insn (gen_mulrf3_cond (e2, cond, e1, e1, zero, status1, trunc_off));
    439  1.1  mrg   /* y3 = y2 + (y2 * e2)	*/
    440  1.1  mrg   emit_insn (gen_m2addrf4_cond (y3, cond, y2, y2, e2, zero, status1, trunc_off));
    441  1.1  mrg   /* q  = double (a * y3)	*/
    442  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y3, zero, status1, trunc_dbl));
    443  1.1  mrg   /* r  = a - (b * q)		*/
    444  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, b, q, zero, status1, trunc_off));
    445  1.1  mrg   /* Q  = double (q + (r * y3))	*/
    446  1.1  mrg   emit_insn (gen_m2addrf4_cond (q_res, cond, q, r, y3, y, status0, trunc_dbl));
    447  1.1  mrg   /* Conversion back into DFmode */
    448  1.1  mrg   emit_insn (gen_truncrfdf2 (operands[0], q_res));
    449  1.1  mrg   DONE;
    450  1.1  mrg })
    451  1.1  mrg 
    452  1.1  mrg ;; Double precision floating point division (minimum latency algorithm).
    453  1.1  mrg 
    454  1.1  mrg (define_expand "divdf3_internal_lat"
    455  1.1  mrg   [(set (match_operand:DF 0 "fr_register_operand" "")
    456  1.1  mrg         (div:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "")
    457  1.1  mrg                 (match_operand:DF 2 "fr_reg_or_fp01_operand" "")))]
    458  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    459  1.1  mrg {
    460  1.1  mrg   rtx q_res     = gen_reg_rtx (RFmode);
    461  1.1  mrg   rtx a         = gen_reg_rtx (RFmode);
    462  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
    463  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    464  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    465  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    466  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    467  1.1  mrg   rtx q1        = gen_reg_rtx (RFmode);
    468  1.1  mrg   rtx y2        = gen_reg_rtx (RFmode);
    469  1.1  mrg   rtx e2        = gen_reg_rtx (RFmode);
    470  1.1  mrg   rtx q2        = gen_reg_rtx (RFmode);
    471  1.1  mrg   rtx e3        = gen_reg_rtx (RFmode);
    472  1.1  mrg   rtx q         = gen_reg_rtx (RFmode);
    473  1.1  mrg   rtx r1        = gen_reg_rtx (RFmode);
    474  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    475  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    476  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    477  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
    478  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    479  1.1  mrg   rtx trunc_dbl = CONST1_RTX (SImode);
    480  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    481  1.1  mrg 
    482  1.1  mrg   /* Empty conversions to put inputs into RFmode */
    483  1.1  mrg   emit_insn (gen_extenddfrf2 (a, operands[1]));
    484  1.1  mrg   emit_insn (gen_extenddfrf2 (b, operands[2]));
    485  1.1  mrg   /* y  = 1 / b			*/
    486  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status0));
    487  1.1  mrg   /* e  = 1 - (b * y)		*/
    488  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    489  1.1  mrg   /* q  = a * y                 */
    490  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y, zero, status1, trunc_off));
    491  1.1  mrg   /* e2 = e + (e * e)		*/
    492  1.1  mrg   emit_insn (gen_m2addrf4_cond (e2, cond, e, e, e, zero, status1, trunc_off));
    493  1.1  mrg   /* e1 = e * e                 */
    494  1.1  mrg   emit_insn (gen_mulrf3_cond (e1, cond, e, e, zero, status1, trunc_off));
    495  1.1  mrg   /* e3 = e + (e1 * e1)		*/
    496  1.1  mrg   emit_insn (gen_m2addrf4_cond (e3, cond, e, e1, e1, zero, status1, trunc_off));
    497  1.1  mrg   /* q1 = q + (q * e2)		*/
    498  1.1  mrg   emit_insn (gen_m2addrf4_cond (q1, cond, q, q, e2, zero, status1, trunc_off));
    499  1.1  mrg   /* y1 = y + (y * e2)		*/
    500  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e2, zero, status1, trunc_off));
    501  1.1  mrg   /* q2 = double(q + (q1 * e3))	*/
    502  1.1  mrg   emit_insn (gen_m2addrf4_cond (q2, cond, q, q1, e3, zero, status1, trunc_dbl));
    503  1.1  mrg   /* y2 = y + (y1 * e3)		*/
    504  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y, y1, e3, zero, status1, trunc_off));
    505  1.1  mrg   /* r1  = a - (b * q2)		*/
    506  1.1  mrg   emit_insn (gen_m2subrf4_cond (r1, cond, a, b, q2, zero, status1, trunc_off));
    507  1.1  mrg   /* Q  = double (q2 + (r1 * y2))	*/
    508  1.1  mrg   emit_insn (gen_m2addrf4_cond (q_res, cond, q2, r1, y2, y, status0, trunc_dbl));
    509  1.1  mrg   /* Conversion back into DFmode */
    510  1.1  mrg   emit_insn (gen_truncrfdf2 (operands[0], q_res));
    511  1.1  mrg   DONE;
    512  1.1  mrg })
    513  1.1  mrg 
    514  1.1  mrg ;; Extended precision floating point division.
    515  1.1  mrg 
    516  1.1  mrg (define_expand "divxf3"
    517  1.1  mrg   [(set (match_operand:XF 0 "fr_register_operand" "")
    518  1.1  mrg         (div:XF (match_operand:XF 1 "fr_reg_or_fp01_operand" "")
    519  1.1  mrg                 (match_operand:XF 2 "fr_reg_or_fp01_operand" "")))]
    520  1.1  mrg   "TARGET_INLINE_FLOAT_DIV"
    521  1.1  mrg {
    522  1.1  mrg   rtx q_res     = gen_reg_rtx (RFmode);
    523  1.1  mrg   rtx a         = gen_reg_rtx (RFmode);
    524  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
    525  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    526  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    527  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    528  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    529  1.1  mrg   rtx q1        = gen_reg_rtx (RFmode);
    530  1.1  mrg   rtx y2        = gen_reg_rtx (RFmode);
    531  1.1  mrg   rtx e2        = gen_reg_rtx (RFmode);
    532  1.1  mrg   rtx y3        = gen_reg_rtx (RFmode);
    533  1.1  mrg   rtx e3        = gen_reg_rtx (RFmode);
    534  1.1  mrg   rtx e4        = gen_reg_rtx (RFmode);
    535  1.1  mrg   rtx q         = gen_reg_rtx (RFmode);
    536  1.1  mrg   rtx r         = gen_reg_rtx (RFmode);
    537  1.1  mrg   rtx r1        = gen_reg_rtx (RFmode);
    538  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    539  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    540  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    541  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
    542  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    543  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    544  1.1  mrg 
    545  1.1  mrg   /* Empty conversions to put inputs into RFmode */
    546  1.1  mrg   emit_insn (gen_extendxfrf2 (a, operands[1]));
    547  1.1  mrg   emit_insn (gen_extendxfrf2 (b, operands[2]));
    548  1.1  mrg   /* y  = 1 / b			*/
    549  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status0));
    550  1.1  mrg   /* e  = 1 - (b * y)		*/
    551  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    552  1.1  mrg   /* q  = a * y                 */
    553  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y, zero, status1, trunc_off));
    554  1.1  mrg   /* e2 = e + (e * e)		*/
    555  1.1  mrg   emit_insn (gen_m2addrf4_cond (e2, cond, e, e, e, zero, status1, trunc_off));
    556  1.1  mrg   /* e1 = e * e                 */
    557  1.1  mrg   emit_insn (gen_mulrf3_cond (e1, cond, e, e, zero, status1, trunc_off));
    558  1.1  mrg   /* y1 = y + (y * e2)		*/
    559  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e2, zero, status1, trunc_off));
    560  1.1  mrg   /* e3 = e + (e1 * e1)		*/
    561  1.1  mrg   emit_insn (gen_m2addrf4_cond (e3, cond, e, e1, e1, zero, status1, trunc_off));
    562  1.1  mrg   /* y2 = y + (y1 * e3)		*/
    563  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y, y1, e3, zero, status1, trunc_off));
    564  1.1  mrg   /* r  = a - (b * q)		*/
    565  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, b, q, zero, status1, trunc_off));
    566  1.1  mrg   /* e4  = 1 - (b * y2)		*/
    567  1.1  mrg   emit_insn (gen_m2subrf4_cond (e4, cond, one, b, y2, zero, status1, trunc_off));
    568  1.1  mrg   /* q1 = q + (r * y2)		*/
    569  1.1  mrg   emit_insn (gen_m2addrf4_cond (q1, cond, q, r, y2, zero, status1, trunc_off));
    570  1.1  mrg   /* y3 = y2 + (y2 * e4)	*/
    571  1.1  mrg   emit_insn (gen_m2addrf4_cond (y3, cond, y2, y2, e4, zero, status1, trunc_off));
    572  1.1  mrg   /* r1  = a - (b * q1)		*/
    573  1.1  mrg   emit_insn (gen_m2subrf4_cond (r1, cond, a, b, q1, zero, status1, trunc_off));
    574  1.1  mrg   /* Q  = q1 + (r1 * y3)	*/
    575  1.1  mrg   emit_insn (gen_m2addrf4_cond (q_res, cond, q1, r1, y3, y, status0, trunc_off));
    576  1.1  mrg   /* Conversion back into XFmode */
    577  1.1  mrg   emit_insn (gen_truncrfxf2 (operands[0], q_res));
    578  1.1  mrg   DONE;
    579  1.1  mrg })
    580  1.1  mrg 
    581  1.1  mrg 
    582  1.1  mrg ;; Integer division operations
    583  1.1  mrg 
    584  1.1  mrg (define_expand "divsi3"
    585  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    586  1.1  mrg 	(div:SI (match_operand:SI 1 "general_operand" "")
    587  1.1  mrg 		(match_operand:SI 2 "general_operand" "")))]
    588  1.1  mrg   "TARGET_INLINE_INT_DIV"
    589  1.1  mrg {
    590  1.1  mrg   rtx op1_rf, op2_rf, op0_rf, op0_di;
    591  1.1  mrg 
    592  1.1  mrg   op0_rf = gen_reg_rtx (RFmode);
    593  1.1  mrg   op0_di = gen_reg_rtx (DImode);
    594  1.1  mrg 
    595  1.1  mrg   if (! register_operand (operands[1], SImode))
    596  1.1  mrg     operands[1] = force_reg (SImode, operands[1]);
    597  1.1  mrg   op1_rf = gen_reg_rtx (RFmode);
    598  1.1  mrg   expand_float (op1_rf, operands[1], 0);
    599  1.1  mrg 
    600  1.1  mrg   if (! register_operand (operands[2], SImode))
    601  1.1  mrg     operands[2] = force_reg (SImode, operands[2]);
    602  1.1  mrg   op2_rf = gen_reg_rtx (RFmode);
    603  1.1  mrg   expand_float (op2_rf, operands[2], 0);
    604  1.1  mrg 
    605  1.1  mrg   emit_insn (gen_cond_trap (EQ, operands[2], CONST0_RTX (SImode),
    606  1.1  mrg 			    CONST1_RTX (SImode)));
    607  1.1  mrg   
    608  1.1  mrg   emit_insn (gen_divsi3_internal (op0_rf, op1_rf, op2_rf));
    609  1.1  mrg 
    610  1.1  mrg   emit_insn (gen_fix_truncrfdi2_alts (op0_di, op0_rf, const1_rtx));
    611  1.1  mrg   emit_move_insn (operands[0], gen_lowpart (SImode, op0_di));
    612  1.1  mrg   DONE;
    613  1.1  mrg })
    614  1.1  mrg 
    615  1.1  mrg (define_expand "modsi3"
    616  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    617  1.1  mrg 	(mod:SI (match_operand:SI 1 "general_operand" "")
    618  1.1  mrg 		(match_operand:SI 2 "general_operand" "")))]
    619  1.1  mrg   "TARGET_INLINE_INT_DIV"
    620  1.1  mrg {
    621  1.1  mrg   rtx op2_neg, op1_di, div;
    622  1.1  mrg 
    623  1.1  mrg   div = gen_reg_rtx (SImode);
    624  1.1  mrg   emit_insn (gen_divsi3 (div, operands[1], operands[2]));
    625  1.1  mrg 
    626  1.1  mrg   op2_neg = expand_unop (SImode, neg_optab, operands[2], NULL_RTX, 0);
    627  1.1  mrg 
    628  1.1  mrg   /* This is a trick to get us to reuse the value that we're sure to
    629  1.1  mrg      have already copied to the FP regs.  */
    630  1.1  mrg   op1_di = gen_reg_rtx (DImode);
    631  1.1  mrg   convert_move (op1_di, operands[1], 0);
    632  1.1  mrg 
    633  1.1  mrg   emit_insn (gen_maddsi4 (operands[0], div, op2_neg,
    634  1.1  mrg 			  gen_lowpart (SImode, op1_di)));
    635  1.1  mrg   DONE;
    636  1.1  mrg })
    637  1.1  mrg 
    638  1.1  mrg (define_expand "udivsi3"
    639  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    640  1.1  mrg 	(udiv:SI (match_operand:SI 1 "general_operand" "")
    641  1.1  mrg 		 (match_operand:SI 2 "general_operand" "")))]
    642  1.1  mrg   "TARGET_INLINE_INT_DIV"
    643  1.1  mrg {
    644  1.1  mrg   rtx op1_rf, op2_rf, op0_rf, op0_di;
    645  1.1  mrg 
    646  1.1  mrg   op0_rf = gen_reg_rtx (RFmode);
    647  1.1  mrg   op0_di = gen_reg_rtx (DImode);
    648  1.1  mrg 
    649  1.1  mrg   if (! register_operand (operands[1], SImode))
    650  1.1  mrg     operands[1] = force_reg (SImode, operands[1]);
    651  1.1  mrg   op1_rf = gen_reg_rtx (RFmode);
    652  1.1  mrg   expand_float (op1_rf, operands[1], 1);
    653  1.1  mrg 
    654  1.1  mrg   if (! register_operand (operands[2], SImode))
    655  1.1  mrg     operands[2] = force_reg (SImode, operands[2]);
    656  1.1  mrg   op2_rf = gen_reg_rtx (RFmode);
    657  1.1  mrg   expand_float (op2_rf, operands[2], 1);
    658  1.1  mrg 
    659  1.1  mrg   emit_insn (gen_cond_trap (EQ, operands[2], CONST0_RTX (SImode),
    660  1.1  mrg                             CONST1_RTX (SImode)));
    661  1.1  mrg   
    662  1.1  mrg   emit_insn (gen_divsi3_internal (op0_rf, op1_rf, op2_rf));
    663  1.1  mrg 
    664  1.1  mrg   emit_insn (gen_fixuns_truncrfdi2_alts (op0_di, op0_rf, const1_rtx));
    665  1.1  mrg   emit_move_insn (operands[0], gen_lowpart (SImode, op0_di));
    666  1.1  mrg   DONE;
    667  1.1  mrg })
    668  1.1  mrg 
    669  1.1  mrg (define_expand "umodsi3"
    670  1.1  mrg   [(set (match_operand:SI 0 "register_operand" "")
    671  1.1  mrg 	(umod:SI (match_operand:SI 1 "general_operand" "")
    672  1.1  mrg 		 (match_operand:SI 2 "general_operand" "")))]
    673  1.1  mrg   "TARGET_INLINE_INT_DIV"
    674  1.1  mrg {
    675  1.1  mrg   rtx op2_neg, op1_di, div;
    676  1.1  mrg 
    677  1.1  mrg   div = gen_reg_rtx (SImode);
    678  1.1  mrg   emit_insn (gen_udivsi3 (div, operands[1], operands[2]));
    679  1.1  mrg 
    680  1.1  mrg   op2_neg = expand_unop (SImode, neg_optab, operands[2], NULL_RTX, 0);
    681  1.1  mrg 
    682  1.1  mrg   /* This is a trick to get us to reuse the value that we're sure to
    683  1.1  mrg      have already copied to the FP regs.  */
    684  1.1  mrg   op1_di = gen_reg_rtx (DImode);
    685  1.1  mrg   convert_move (op1_di, operands[1], 1);
    686  1.1  mrg 
    687  1.1  mrg   emit_insn (gen_maddsi4 (operands[0], div, op2_neg,
    688  1.1  mrg 			  gen_lowpart (SImode, op1_di)));
    689  1.1  mrg   DONE;
    690  1.1  mrg })
    691  1.1  mrg 
    692  1.1  mrg (define_expand "divsi3_internal"
    693  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "")
    694  1.1  mrg         (float:RF (div:SI (match_operand:RF 1 "fr_register_operand" "")
    695  1.1  mrg                           (match_operand:RF 2 "fr_register_operand" ""))))]
    696  1.1  mrg   "TARGET_INLINE_INT_DIV"
    697  1.1  mrg {
    698  1.1  mrg   rtx a         = operands[1];
    699  1.1  mrg   rtx b         = operands[2];
    700  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    701  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    702  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    703  1.1  mrg   rtx q         = gen_reg_rtx (RFmode);
    704  1.1  mrg   rtx q1        = gen_reg_rtx (RFmode);
    705  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    706  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    707  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    708  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    709  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    710  1.1  mrg   rtx twon34_exp = gen_reg_rtx (DImode);
    711  1.1  mrg   rtx twon34    = gen_reg_rtx (RFmode);
    712  1.1  mrg 
    713  1.1  mrg   /* Load cosntant 2**(-34) */
    714  1.1  mrg   emit_move_insn (twon34_exp, GEN_INT (65501));
    715  1.1  mrg   emit_insn (gen_setf_exp_rf (twon34, twon34_exp));
    716  1.1  mrg 
    717  1.1  mrg   /* y  = 1 / b			*/
    718  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status1));
    719  1.1  mrg   /* e  = 1 - (b * y)		*/
    720  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    721  1.1  mrg   /* q  = a * y                 */
    722  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y, zero, status1, trunc_off));
    723  1.1  mrg   /* q1 = q + (q * e)		*/
    724  1.1  mrg   emit_insn (gen_m2addrf4_cond (q1, cond, q, q, e, zero, status1, trunc_off));
    725  1.1  mrg   /* e1 = (2**-34) + (e * e)		*/
    726  1.1  mrg   emit_insn (gen_m2addrf4_cond (e1, cond, twon34, e, e, zero, status1, trunc_off));
    727  1.1  mrg   /* q2 = q1 + (e1 * q1)		*/
    728  1.1  mrg   emit_insn (gen_m2addrf4_cond (operands[0], cond, q1, e1, q1, y, status1, trunc_off));
    729  1.1  mrg   DONE;
    730  1.1  mrg })
    731  1.1  mrg 
    732  1.1  mrg (define_expand "divdi3"
    733  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
    734  1.1  mrg 	(div:DI (match_operand:DI 1 "general_operand" "")
    735  1.1  mrg 		(match_operand:DI 2 "general_operand" "")))]
    736  1.1  mrg   "TARGET_INLINE_INT_DIV"
    737  1.1  mrg {
    738  1.1  mrg   rtx op1_rf, op2_rf, op0_rf;
    739  1.1  mrg 
    740  1.1  mrg   op0_rf = gen_reg_rtx (RFmode);
    741  1.1  mrg 
    742  1.1  mrg   if (! register_operand (operands[1], DImode))
    743  1.1  mrg     operands[1] = force_reg (DImode, operands[1]);
    744  1.1  mrg   op1_rf = gen_reg_rtx (RFmode);
    745  1.1  mrg   expand_float (op1_rf, operands[1], 0);
    746  1.1  mrg 
    747  1.1  mrg   if (! register_operand (operands[2], DImode))
    748  1.1  mrg     operands[2] = force_reg (DImode, operands[2]);
    749  1.1  mrg   op2_rf = gen_reg_rtx (RFmode);
    750  1.1  mrg   expand_float (op2_rf, operands[2], 0);
    751  1.1  mrg 
    752  1.1  mrg   emit_insn (gen_cond_trap (EQ, operands[2], CONST0_RTX (DImode),
    753  1.1  mrg                             CONST1_RTX (DImode)));
    754  1.1  mrg 
    755  1.1  mrg   if (TARGET_INLINE_INT_DIV == INL_MIN_LAT)
    756  1.1  mrg     emit_insn (gen_divdi3_internal_lat (op0_rf, op1_rf, op2_rf));
    757  1.1  mrg   else
    758  1.1  mrg     emit_insn (gen_divdi3_internal_thr (op0_rf, op1_rf, op2_rf));
    759  1.1  mrg 
    760  1.1  mrg   emit_insn (gen_fix_truncrfdi2_alts (operands[0], op0_rf, const1_rtx));
    761  1.1  mrg   DONE;
    762  1.1  mrg })
    763  1.1  mrg 
    764  1.1  mrg (define_expand "moddi3"
    765  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
    766  1.1  mrg 	(mod:SI (match_operand:DI 1 "general_operand" "")
    767  1.1  mrg 		(match_operand:DI 2 "general_operand" "")))]
    768  1.1  mrg   "TARGET_INLINE_INT_DIV"
    769  1.1  mrg {
    770  1.1  mrg   rtx op2_neg, div;
    771  1.1  mrg 
    772  1.1  mrg   div = gen_reg_rtx (DImode);
    773  1.1  mrg   emit_insn (gen_divdi3 (div, operands[1], operands[2]));
    774  1.1  mrg 
    775  1.1  mrg   op2_neg = expand_unop (DImode, neg_optab, operands[2], NULL_RTX, 0);
    776  1.1  mrg 
    777  1.1  mrg   emit_insn (gen_madddi4 (operands[0], div, op2_neg, operands[1]));
    778  1.1  mrg   DONE;
    779  1.1  mrg })
    780  1.1  mrg 
    781  1.1  mrg (define_expand "udivdi3"
    782  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
    783  1.1  mrg 	(udiv:DI (match_operand:DI 1 "general_operand" "")
    784  1.1  mrg 		 (match_operand:DI 2 "general_operand" "")))]
    785  1.1  mrg   "TARGET_INLINE_INT_DIV"
    786  1.1  mrg {
    787  1.1  mrg   rtx op1_rf, op2_rf, op0_rf;
    788  1.1  mrg 
    789  1.1  mrg   op0_rf = gen_reg_rtx (RFmode);
    790  1.1  mrg 
    791  1.1  mrg   if (! register_operand (operands[1], DImode))
    792  1.1  mrg     operands[1] = force_reg (DImode, operands[1]);
    793  1.1  mrg   op1_rf = gen_reg_rtx (RFmode);
    794  1.1  mrg   expand_float (op1_rf, operands[1], 1);
    795  1.1  mrg 
    796  1.1  mrg   if (! register_operand (operands[2], DImode))
    797  1.1  mrg     operands[2] = force_reg (DImode, operands[2]);
    798  1.1  mrg   op2_rf = gen_reg_rtx (RFmode);
    799  1.1  mrg   expand_float (op2_rf, operands[2], 1);
    800  1.1  mrg 
    801  1.1  mrg   emit_insn (gen_cond_trap (EQ, operands[2], CONST0_RTX (DImode),
    802  1.1  mrg                             CONST1_RTX (DImode)));
    803  1.1  mrg 
    804  1.1  mrg   if (TARGET_INLINE_INT_DIV == INL_MIN_LAT)
    805  1.1  mrg     emit_insn (gen_divdi3_internal_lat (op0_rf, op1_rf, op2_rf));
    806  1.1  mrg   else
    807  1.1  mrg     emit_insn (gen_divdi3_internal_thr (op0_rf, op1_rf, op2_rf));
    808  1.1  mrg 
    809  1.1  mrg   emit_insn (gen_fixuns_truncrfdi2_alts (operands[0], op0_rf, const1_rtx));
    810  1.1  mrg   DONE;
    811  1.1  mrg })
    812  1.1  mrg 
    813  1.1  mrg (define_expand "umoddi3"
    814  1.1  mrg   [(set (match_operand:DI 0 "register_operand" "")
    815  1.1  mrg 	(umod:DI (match_operand:DI 1 "general_operand" "")
    816  1.1  mrg 		 (match_operand:DI 2 "general_operand" "")))]
    817  1.1  mrg   "TARGET_INLINE_INT_DIV"
    818  1.1  mrg {
    819  1.1  mrg   rtx op2_neg, div;
    820  1.1  mrg 
    821  1.1  mrg   div = gen_reg_rtx (DImode);
    822  1.1  mrg   emit_insn (gen_udivdi3 (div, operands[1], operands[2]));
    823  1.1  mrg 
    824  1.1  mrg   op2_neg = expand_unop (DImode, neg_optab, operands[2], NULL_RTX, 0);
    825  1.1  mrg 
    826  1.1  mrg   emit_insn (gen_madddi4 (operands[0], div, op2_neg, operands[1]));
    827  1.1  mrg   DONE;
    828  1.1  mrg })
    829  1.1  mrg 
    830  1.1  mrg (define_expand "divdi3_internal_lat"
    831  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "")
    832  1.1  mrg         (float:RF (div:DI (match_operand:RF 1 "fr_register_operand" "")
    833  1.1  mrg                           (match_operand:RF 2 "fr_register_operand" ""))))]
    834  1.1  mrg   "TARGET_INLINE_INT_DIV"
    835  1.1  mrg {
    836  1.1  mrg   rtx a         = operands[1];
    837  1.1  mrg   rtx b         = operands[2];
    838  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    839  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    840  1.1  mrg   rtx y2        = gen_reg_rtx (RFmode);
    841  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    842  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    843  1.1  mrg   rtx q         = gen_reg_rtx (RFmode);
    844  1.1  mrg   rtx q1        = gen_reg_rtx (RFmode);
    845  1.1  mrg   rtx q2        = gen_reg_rtx (RFmode);
    846  1.1  mrg   rtx r         = gen_reg_rtx (RFmode);
    847  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    848  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    849  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    850  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    851  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    852  1.1  mrg 
    853  1.1  mrg   /* y  = 1 / b			*/
    854  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status1));
    855  1.1  mrg   /* e  = 1 - (b * y)		*/
    856  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    857  1.1  mrg   /* q  = a * y                 */
    858  1.1  mrg   emit_insn (gen_mulrf3_cond (q, cond, a, y, zero, status1, trunc_off));
    859  1.1  mrg   /* q1 = q + (q * e)		*/
    860  1.1  mrg   emit_insn (gen_m2addrf4_cond (q1, cond, q, q, e, zero, status1, trunc_off));
    861  1.1  mrg   /* e1 = e * e			*/
    862  1.1  mrg   emit_insn (gen_mulrf3_cond (e1, cond, e, e, zero, status1, trunc_off));
    863  1.1  mrg   /* q2 = q1 + (e1 * q1)	*/
    864  1.1  mrg   emit_insn (gen_m2addrf4_cond (q2, cond, q1, e1, q1, zero, status1, trunc_off));
    865  1.1  mrg   /* y1 = y + (y * e)		*/
    866  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e, zero, status1, trunc_off));
    867  1.1  mrg   /* r  = a - (b * q2)		*/
    868  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, b, q2, zero, status1, trunc_off));
    869  1.1  mrg   /* y2 = y1 + (y1 * e1)	*/
    870  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y1, y1, e1, zero, status1, trunc_off));
    871  1.1  mrg   /* q3 = q2 + (r * y2)		*/
    872  1.1  mrg   emit_insn (gen_m2addrf4_cond (operands[0], cond, q2, r, y2, y, status1, trunc_off));
    873  1.1  mrg   DONE;
    874  1.1  mrg })
    875  1.1  mrg 
    876  1.1  mrg (define_expand "divdi3_internal_thr"
    877  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "")
    878  1.1  mrg         (float:RF (div:DI (match_operand:RF 1 "fr_register_operand" "")
    879  1.1  mrg                           (match_operand:RF 2 "fr_register_operand" ""))))]
    880  1.1  mrg   "TARGET_INLINE_INT_DIV"
    881  1.1  mrg {
    882  1.1  mrg   rtx a         = operands[1];
    883  1.1  mrg   rtx b         = operands[2];
    884  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    885  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    886  1.1  mrg   rtx y2        = gen_reg_rtx (RFmode);
    887  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    888  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
    889  1.1  mrg   rtx q2        = gen_reg_rtx (RFmode);
    890  1.1  mrg   rtx r         = gen_reg_rtx (RFmode);
    891  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    892  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    893  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    894  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    895  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    896  1.1  mrg 
    897  1.1  mrg   /* y  = 1 / b			*/
    898  1.1  mrg   emit_insn (gen_recip_approx_rf (y, a, b, cond, status1));
    899  1.1  mrg   /* e  = 1 - (b * y)		*/
    900  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, b, y, zero, status1, trunc_off));
    901  1.1  mrg   /* y1 = y + (y * e)		*/
    902  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, y, e, zero, status1, trunc_off));
    903  1.1  mrg   /* e1 = e * e			*/
    904  1.1  mrg   emit_insn (gen_mulrf3_cond (e1, cond, e, e, zero, status1, trunc_off));
    905  1.1  mrg   /* y2 = y1 + (y1 * e1)	*/
    906  1.1  mrg   emit_insn (gen_m2addrf4_cond (y2, cond, y1, y1, e1, zero, status1, trunc_off));
    907  1.1  mrg   /* q2 = y2 * a		*/
    908  1.1  mrg   emit_insn (gen_mulrf3_cond (q2, cond, y2, a, zero, status1, trunc_off));
    909  1.1  mrg   /* r  = a - (b * q2)		*/
    910  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, a, b, q2, zero, status1, trunc_off));
    911  1.1  mrg   /* q3 = q2 + (r * y2)		*/
    912  1.1  mrg   emit_insn (gen_m2addrf4_cond (operands[0], cond, q2, r, y2, y, status1, trunc_off));
    913  1.1  mrg   DONE;
    914  1.1  mrg })
    915  1.1  mrg 
    916  1.1  mrg ;; SQRT operations
    917  1.1  mrg 
    918  1.1  mrg 
    919  1.1  mrg (define_insn "sqrt_approx_rf"
    920  1.1  mrg   [(set (match_operand:RF 0 "fr_register_operand" "=f")
    921  1.1  mrg                 (unspec:RF [(match_operand:RF 1 "fr_reg_or_fp01_operand" "fG")]
    922  1.1  mrg 			   UNSPEC_FR_SQRT_RECIP_APPROX_RES))
    923  1.1  mrg    (set (match_operand:BI 2 "register_operand" "=c")
    924  1.1  mrg         (unspec:BI [(match_dup 1)] UNSPEC_FR_SQRT_RECIP_APPROX))
    925  1.1  mrg    (use (match_operand:SI 3 "const_int_operand" ""))]
    926  1.1  mrg   ""
    927  1.1  mrg   "frsqrta.s%3 %0, %2 = %F1"
    928  1.1  mrg   [(set_attr "itanium_class" "fmisc")
    929  1.1  mrg    (set_attr "predicable" "no")])
    930  1.1  mrg 
    931  1.1  mrg (define_expand "sqrtsf2"
    932  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "=&f")
    933  1.1  mrg 	(sqrt:SF (match_operand:SF 1 "fr_reg_or_fp01_operand" "fG")))]
    934  1.1  mrg   "TARGET_INLINE_SQRT"
    935  1.1  mrg {
    936  1.1  mrg   rtx insn;
    937  1.1  mrg   if (TARGET_INLINE_SQRT == INL_MIN_LAT)
    938  1.1  mrg     insn = gen_sqrtsf2_internal_lat (operands[0], operands[1]);
    939  1.1  mrg   else
    940  1.1  mrg     insn = gen_sqrtsf2_internal_thr (operands[0], operands[1]);
    941  1.1  mrg   emit_insn (insn);
    942  1.1  mrg   DONE;
    943  1.1  mrg })
    944  1.1  mrg 
    945  1.1  mrg (define_expand "sqrtsf2_internal_thr"
    946  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "")
    947  1.1  mrg         (sqrt:SF (match_operand:SF 1 "fr_register_operand" "")))]
    948  1.1  mrg   "TARGET_INLINE_SQRT"
    949  1.1  mrg {
    950  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
    951  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
    952  1.1  mrg   rtx g         = gen_reg_rtx (RFmode);
    953  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
    954  1.1  mrg   rtx s         = gen_reg_rtx (RFmode);
    955  1.1  mrg   rtx f         = gen_reg_rtx (RFmode);
    956  1.1  mrg   rtx y1        = gen_reg_rtx (RFmode);
    957  1.1  mrg   rtx g1        = gen_reg_rtx (RFmode);
    958  1.1  mrg   rtx h         = gen_reg_rtx (RFmode);
    959  1.1  mrg   rtx d         = gen_reg_rtx (RFmode);
    960  1.1  mrg   rtx g2        = gen_reg_rtx (RFmode);
    961  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
    962  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
    963  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
    964  1.1  mrg   rtx c1        = ia64_dconst_0_5();
    965  1.1  mrg   rtx c2        = ia64_dconst_0_375();
    966  1.1  mrg   rtx reg_df_c1	= gen_reg_rtx (DFmode);
    967  1.1  mrg   rtx reg_df_c2	= gen_reg_rtx (DFmode);
    968  1.1  mrg   rtx reg_rf_c1 = gen_reg_rtx (RFmode);
    969  1.1  mrg   rtx reg_rf_c2 = gen_reg_rtx (RFmode);
    970  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
    971  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
    972  1.1  mrg   rtx trunc_sgl = CONST0_RTX (SImode);
    973  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
    974  1.1  mrg 
    975  1.1  mrg   /* Put needed constants into registers.	 */
    976  1.1  mrg   emit_insn (gen_movdf (reg_df_c1, c1));
    977  1.1  mrg   emit_insn (gen_movdf (reg_df_c2, c2));
    978  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c1, reg_df_c1));
    979  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c2, reg_df_c2));
    980  1.1  mrg   /* Empty conversion to put input into RFmode.  */
    981  1.1  mrg   emit_insn (gen_extendsfrf2 (b, operands[1]));
    982  1.1  mrg   /* y = sqrt (1 / b)			*/
    983  1.1  mrg   emit_insn (gen_sqrt_approx_rf (y, b, cond, status0));
    984  1.1  mrg   /* g = b * y				*/
    985  1.1  mrg   emit_insn (gen_mulrf3_cond (g, cond, b, y, zero, status1, trunc_off));
    986  1.1  mrg   /* e = 1 - (g * y)			*/
    987  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, g, y, zero, status1, trunc_off));
    988  1.1  mrg   /* s = 0.5 + (0.375 * e)		*/
    989  1.1  mrg   emit_insn (gen_m2addrf4_cond (s, cond, reg_rf_c1, reg_rf_c2, e, zero, status1, trunc_off));
    990  1.1  mrg   /* f = y * e				*/
    991  1.1  mrg   emit_insn (gen_mulrf3_cond (f, cond, y, e, zero, status1, trunc_off));
    992  1.1  mrg   /* y1 = y + (f * s)			*/
    993  1.1  mrg   emit_insn (gen_m2addrf4_cond (y1, cond, y, f, s, zero, status1, trunc_off));
    994  1.1  mrg   /* g1 = single (b * y1)		*/
    995  1.1  mrg   emit_insn (gen_mulrf3_cond (g1, cond, b, y1, zero, status1, trunc_sgl));
    996  1.1  mrg   /* h = 0.5 * y1			*/
    997  1.1  mrg   emit_insn (gen_mulrf3_cond (h, cond, reg_rf_c1, y1, zero, status1, trunc_off));
    998  1.1  mrg   /* d = b - g1 * g1			*/
    999  1.1  mrg   emit_insn (gen_m2subrf4_cond (d, cond, b, g1, g1, zero, status1, trunc_off));
   1000  1.1  mrg   /* g2 = single(g1 + (d * h))		*/
   1001  1.1  mrg   emit_insn (gen_m2addrf4_cond (g2, cond, g1, d, h, y, status0, trunc_sgl));
   1002  1.1  mrg   /* Conversion back into SFmode.       */
   1003  1.1  mrg   emit_insn (gen_truncrfsf2 (operands[0], g2));
   1004  1.1  mrg   DONE;
   1005  1.1  mrg })
   1006  1.1  mrg 
   1007  1.1  mrg (define_expand "sqrtsf2_internal_lat"
   1008  1.1  mrg   [(set (match_operand:SF 0 "fr_register_operand" "")
   1009  1.1  mrg         (sqrt:SF (match_operand:SF 1 "fr_register_operand" "")))]
   1010  1.1  mrg   "TARGET_INLINE_SQRT"
   1011  1.1  mrg {
   1012  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
   1013  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
   1014  1.1  mrg   rtx g         = gen_reg_rtx (RFmode);
   1015  1.1  mrg   rtx g1        = gen_reg_rtx (RFmode);
   1016  1.1  mrg   rtx g2        = gen_reg_rtx (RFmode);
   1017  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
   1018  1.1  mrg   rtx s         = gen_reg_rtx (RFmode);
   1019  1.1  mrg   rtx f         = gen_reg_rtx (RFmode);
   1020  1.1  mrg   rtx f1        = gen_reg_rtx (RFmode);
   1021  1.1  mrg   rtx h         = gen_reg_rtx (RFmode);
   1022  1.1  mrg   rtx h1        = gen_reg_rtx (RFmode);
   1023  1.1  mrg   rtx d         = gen_reg_rtx (RFmode);
   1024  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
   1025  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
   1026  1.1  mrg   rtx one       = CONST1_RTX (RFmode);
   1027  1.1  mrg   rtx c1        = ia64_dconst_0_5();
   1028  1.1  mrg   rtx c2        = ia64_dconst_0_375();
   1029  1.1  mrg   rtx reg_df_c1	= gen_reg_rtx (DFmode);
   1030  1.1  mrg   rtx reg_df_c2	= gen_reg_rtx (DFmode);
   1031  1.1  mrg   rtx reg_rf_c1 = gen_reg_rtx (RFmode);
   1032  1.1  mrg   rtx reg_rf_c2 = gen_reg_rtx (RFmode);
   1033  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
   1034  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
   1035  1.1  mrg   rtx trunc_sgl = CONST0_RTX (SImode);
   1036  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
   1037  1.1  mrg 
   1038  1.1  mrg   /* Put needed constants into registers.	 */
   1039  1.1  mrg   emit_insn (gen_movdf (reg_df_c1, c1));
   1040  1.1  mrg   emit_insn (gen_movdf (reg_df_c2, c2));
   1041  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c1, reg_df_c1));
   1042  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c2, reg_df_c2));
   1043  1.1  mrg   /* Empty conversion to put input into RFmode.  */
   1044  1.1  mrg   emit_insn (gen_extendsfrf2 (b, operands[1]));
   1045  1.1  mrg   /* y = sqrt (1 / b)			*/
   1046  1.1  mrg   emit_insn (gen_sqrt_approx_rf (y, b, cond, status0));
   1047  1.1  mrg   /* g = b * y				*/
   1048  1.1  mrg   emit_insn (gen_mulrf3_cond (g, cond, b, y, zero, status1, trunc_off));
   1049  1.1  mrg   /* e = 1 - (g * y)			*/
   1050  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, one, g, y, zero, status1, trunc_off));
   1051  1.1  mrg   /* h = 0.5 * y			*/
   1052  1.1  mrg   emit_insn (gen_mulrf3_cond (h, cond, reg_rf_c1, y, zero, status1, trunc_off));
   1053  1.1  mrg   /* s = 0.5 + (0.375 * e)		*/
   1054  1.1  mrg   emit_insn (gen_m2addrf4_cond (s, cond, reg_rf_c1, reg_rf_c2, e, zero, status1, trunc_off));
   1055  1.1  mrg   /* f = e * g				*/
   1056  1.1  mrg   emit_insn (gen_mulrf3_cond (f, cond, e, g, zero, status1, trunc_off));
   1057  1.1  mrg   /* g1 = single (g + (f * s))		*/
   1058  1.1  mrg   emit_insn (gen_m2addrf4_cond (g1, cond, g, f, s, zero, status1, trunc_sgl));
   1059  1.1  mrg   /* f1 = e * h				*/
   1060  1.1  mrg   emit_insn (gen_mulrf3_cond (f1, cond, e, h, zero, status1, trunc_off));
   1061  1.1  mrg   /* d = b - g1 * g1			*/
   1062  1.1  mrg   emit_insn (gen_m2subrf4_cond (d, cond, b, g1, g1, zero, status1, trunc_off));
   1063  1.1  mrg   /* h1 = h + (f1 * s)			*/
   1064  1.1  mrg   emit_insn (gen_m2addrf4_cond (h1, cond, h, f1, s, zero, status1, trunc_off));
   1065  1.1  mrg   /* g2 = single(g1 + (d * h1))		*/
   1066  1.1  mrg   emit_insn (gen_m2addrf4_cond (g2, cond, g1, d, h1, y, status0, trunc_sgl));
   1067  1.1  mrg   /* Conversion back into SFmode.       */
   1068  1.1  mrg   emit_insn (gen_truncrfsf2 (operands[0], g2));
   1069  1.1  mrg   DONE;
   1070  1.1  mrg })
   1071  1.1  mrg 
   1072  1.1  mrg (define_expand "sqrtdf2"
   1073  1.1  mrg   [(set (match_operand:DF 0 "fr_register_operand" "=&f")
   1074  1.1  mrg 	(sqrt:DF (match_operand:DF 1 "fr_reg_or_fp01_operand" "fG")))]
   1075  1.1  mrg   "TARGET_INLINE_SQRT"
   1076  1.1  mrg {
   1077  1.1  mrg   rtx insn;
   1078  1.1  mrg #if 0
   1079  1.1  mrg   if (TARGET_INLINE_SQRT == INL_MIN_LAT)
   1080  1.1  mrg     insn = gen_sqrtdf2_internal_lat (operands[0], operands[1]);
   1081  1.1  mrg   else
   1082  1.1  mrg #endif
   1083  1.1  mrg   insn = gen_sqrtdf2_internal_thr (operands[0], operands[1]);
   1084  1.1  mrg   emit_insn (insn);
   1085  1.1  mrg   DONE;
   1086  1.1  mrg })
   1087  1.1  mrg 
   1088  1.1  mrg (define_expand "sqrtdf2_internal_thr"
   1089  1.1  mrg   [(set (match_operand:DF 0 "fr_register_operand" "")
   1090  1.1  mrg         (sqrt:DF (match_operand:DF 1 "fr_register_operand" "")))]
   1091  1.1  mrg   "TARGET_INLINE_SQRT"
   1092  1.1  mrg {
   1093  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
   1094  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
   1095  1.1  mrg   rtx g         = gen_reg_rtx (RFmode);
   1096  1.1  mrg   rtx g1        = gen_reg_rtx (RFmode);
   1097  1.1  mrg   rtx g2        = gen_reg_rtx (RFmode);
   1098  1.1  mrg   rtx g3        = gen_reg_rtx (RFmode);
   1099  1.1  mrg   rtx g4        = gen_reg_rtx (RFmode);
   1100  1.1  mrg   rtx r         = gen_reg_rtx (RFmode);
   1101  1.1  mrg   rtx r1        = gen_reg_rtx (RFmode);
   1102  1.1  mrg   rtx h         = gen_reg_rtx (RFmode);
   1103  1.1  mrg   rtx h1        = gen_reg_rtx (RFmode);
   1104  1.1  mrg   rtx h2        = gen_reg_rtx (RFmode);
   1105  1.1  mrg   rtx d         = gen_reg_rtx (RFmode);
   1106  1.1  mrg   rtx d1        = gen_reg_rtx (RFmode);
   1107  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
   1108  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
   1109  1.1  mrg   rtx c1        = ia64_dconst_0_5();
   1110  1.1  mrg   rtx reg_df_c1	= gen_reg_rtx (DFmode);
   1111  1.1  mrg   rtx reg_rf_c1 = gen_reg_rtx (RFmode);
   1112  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
   1113  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
   1114  1.1  mrg   rtx trunc_dbl = CONST1_RTX (SImode);
   1115  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
   1116  1.1  mrg 
   1117  1.1  mrg   /* Put needed constants into registers.	 */
   1118  1.1  mrg   emit_insn (gen_movdf (reg_df_c1, c1));
   1119  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c1, reg_df_c1));
   1120  1.1  mrg   /* Empty conversion to put input into RFmode.  */
   1121  1.1  mrg   emit_insn (gen_extenddfrf2 (b, operands[1]));
   1122  1.1  mrg   /* y = sqrt (1 / b)			*/
   1123  1.1  mrg   emit_insn (gen_sqrt_approx_rf (y, b, cond, status0));
   1124  1.1  mrg   /* g = b * y				*/
   1125  1.1  mrg   emit_insn (gen_mulrf3_cond (g, cond, b, y, zero, status1, trunc_off));
   1126  1.1  mrg   /* h = 0.5 * y			*/
   1127  1.1  mrg   emit_insn (gen_mulrf3_cond (h, cond, reg_rf_c1, y, zero, status1, trunc_off));
   1128  1.1  mrg   /* r = 0.5 - (g * h)			*/
   1129  1.1  mrg   emit_insn (gen_m2subrf4_cond (r, cond, reg_rf_c1, g, h, zero, status1, trunc_off));
   1130  1.1  mrg   /* g1 = g + (g * r)			*/
   1131  1.1  mrg   emit_insn (gen_m2addrf4_cond (g1, cond, g, g, r, zero, status1, trunc_off));
   1132  1.1  mrg   /* h1 = h + (h * r)			*/
   1133  1.1  mrg   emit_insn (gen_m2addrf4_cond (h1, cond, h, h, r, zero, status1, trunc_off));
   1134  1.1  mrg   /* r1 = 0.5 - (g1 * h1)		*/
   1135  1.1  mrg   emit_insn (gen_m2subrf4_cond (r1, cond, reg_rf_c1, g1, h1, zero, status1, trunc_off));
   1136  1.1  mrg   /* g2 = g1 + (g1 * r1)		*/
   1137  1.1  mrg   emit_insn (gen_m2addrf4_cond (g2, cond, g1, g1, r1, zero, status1, trunc_off));
   1138  1.1  mrg   /* h2 = h1 + (h1 * r1)		*/
   1139  1.1  mrg   emit_insn (gen_m2addrf4_cond (h2, cond, h1, h1, r1, zero, status1, trunc_off));
   1140  1.1  mrg   /* d = b - (g2 * g2)			*/
   1141  1.1  mrg   emit_insn (gen_m2subrf4_cond (d, cond, b, g2, g2, zero, status1, trunc_off));
   1142  1.1  mrg   /* g3 = g2 + (d * h2)			*/
   1143  1.1  mrg   emit_insn (gen_m2addrf4_cond (g3, cond, g2, d, h2, zero, status1, trunc_off));
   1144  1.1  mrg   /* d1 = b - (g3 * g3)			*/
   1145  1.1  mrg   emit_insn (gen_m2subrf4_cond (d1, cond, b, g3, g3, zero, status1, trunc_off));
   1146  1.1  mrg   /* g4 = g3 + (d1 * h2)		*/
   1147  1.1  mrg   emit_insn (gen_m2addrf4_cond (g4, cond, g3, d1, h2, y, status1, trunc_dbl));
   1148  1.1  mrg   /* Conversion back into SFmode.       */
   1149  1.1  mrg   emit_insn (gen_truncrfdf2 (operands[0], g4));
   1150  1.1  mrg   DONE;
   1151  1.1  mrg })
   1152  1.1  mrg 
   1153  1.1  mrg (define_expand "sqrtxf2"
   1154  1.1  mrg   [(set (match_operand:XF 0 "fr_register_operand" "")
   1155  1.1  mrg         (sqrt:XF (match_operand:XF 1 "fr_register_operand" "")))]
   1156  1.1  mrg   "TARGET_INLINE_SQRT"
   1157  1.1  mrg {
   1158  1.1  mrg   rtx y         = gen_reg_rtx (RFmode);
   1159  1.1  mrg   rtx b         = gen_reg_rtx (RFmode);
   1160  1.1  mrg   rtx g         = gen_reg_rtx (RFmode);
   1161  1.1  mrg   rtx g1        = gen_reg_rtx (RFmode);
   1162  1.1  mrg   rtx g2        = gen_reg_rtx (RFmode);
   1163  1.1  mrg   rtx g3        = gen_reg_rtx (RFmode);
   1164  1.1  mrg   rtx g4        = gen_reg_rtx (RFmode);
   1165  1.1  mrg   rtx e         = gen_reg_rtx (RFmode);
   1166  1.1  mrg   rtx e1        = gen_reg_rtx (RFmode);
   1167  1.1  mrg   rtx e2        = gen_reg_rtx (RFmode);
   1168  1.1  mrg   rtx h         = gen_reg_rtx (RFmode);
   1169  1.1  mrg   rtx h1        = gen_reg_rtx (RFmode);
   1170  1.1  mrg   rtx h2        = gen_reg_rtx (RFmode);
   1171  1.1  mrg   rtx h3        = gen_reg_rtx (RFmode);
   1172  1.1  mrg   rtx d         = gen_reg_rtx (RFmode);
   1173  1.1  mrg   rtx d1        = gen_reg_rtx (RFmode);
   1174  1.1  mrg   rtx cond      = gen_reg_rtx (BImode);
   1175  1.1  mrg   rtx zero      = CONST0_RTX (RFmode);
   1176  1.1  mrg   rtx c1        = ia64_dconst_0_5();
   1177  1.1  mrg   rtx reg_df_c1	= gen_reg_rtx (DFmode);
   1178  1.1  mrg   rtx reg_rf_c1 = gen_reg_rtx (RFmode);
   1179  1.1  mrg   rtx status0   = CONST0_RTX (SImode);
   1180  1.1  mrg   rtx status1   = CONST1_RTX (SImode);
   1181  1.1  mrg   rtx trunc_off = CONST2_RTX (SImode);
   1182  1.1  mrg 
   1183  1.1  mrg   /* Put needed constants into registers.	 */
   1184  1.1  mrg   emit_insn (gen_movdf (reg_df_c1, c1));
   1185  1.1  mrg   emit_insn (gen_extenddfrf2 (reg_rf_c1, reg_df_c1));
   1186  1.1  mrg   /* Empty conversion to put input into RFmode.  */
   1187  1.1  mrg   emit_insn (gen_extendxfrf2 (b, operands[1]));
   1188  1.1  mrg   /* y = sqrt (1 / b)			*/
   1189  1.1  mrg   emit_insn (gen_sqrt_approx_rf (y, b, cond, status0));
   1190  1.1  mrg   /* g = b * y				*/
   1191  1.1  mrg   emit_insn (gen_mulrf3_cond (g, cond, b, y, zero, status1, trunc_off));
   1192  1.1  mrg   /* h = 0.5 * y			*/
   1193  1.1  mrg   emit_insn (gen_mulrf3_cond (h, cond, reg_rf_c1, y, zero, status1, trunc_off));
   1194  1.1  mrg   /* e = 0.5 - (g * h)			*/
   1195  1.1  mrg   emit_insn (gen_m2subrf4_cond (e, cond, reg_rf_c1, g, h, zero, status1, trunc_off));
   1196  1.1  mrg   /* g1 = g + (g * e)			*/
   1197  1.1  mrg   emit_insn (gen_m2addrf4_cond (g1, cond, g, g, e, zero, status1, trunc_off));
   1198  1.1  mrg   /* h1 = h + (h * e)			*/
   1199  1.1  mrg   emit_insn (gen_m2addrf4_cond (h1, cond, h, h, e, zero, status1, trunc_off));
   1200  1.1  mrg   /* e1 = 0.5 - (g1 * h1)		*/
   1201  1.1  mrg   emit_insn (gen_m2subrf4_cond (e1, cond, reg_rf_c1, g1, h1, zero, status1, trunc_off));
   1202  1.1  mrg   /* g2 = g1 + (g1 * e1)		*/
   1203  1.1  mrg   emit_insn (gen_m2addrf4_cond (g2, cond, g1, g1, e1, zero, status1, trunc_off));
   1204  1.1  mrg   /* h2 = h1 + (h1 * e1)		*/
   1205  1.1  mrg   emit_insn (gen_m2addrf4_cond (h2, cond, h1, h1, e1, zero, status1, trunc_off));
   1206  1.1  mrg   /* d = b - (g2 * g2)			*/
   1207  1.1  mrg   emit_insn (gen_m2subrf4_cond (d, cond, b, g2, g2, zero, status1, trunc_off));
   1208  1.1  mrg   /* e2 = 0.5 - (g2 * h2)		*/
   1209  1.1  mrg   emit_insn (gen_m2subrf4_cond (e2, cond, reg_rf_c1, g2, h2, zero, status1, trunc_off));
   1210  1.1  mrg   /* g3 = g2 + (d * h2)			*/
   1211  1.1  mrg   emit_insn (gen_m2addrf4_cond (g3, cond, g2, d, h2, zero, status1, trunc_off));
   1212  1.1  mrg   /* h3 = h2 + (e2 * h2)		*/
   1213  1.1  mrg   emit_insn (gen_m2addrf4_cond (h3, cond, h2, e2, h2, zero, status1, trunc_off));
   1214  1.1  mrg   /* d1 = b - (g3 * g3)			*/
   1215  1.1  mrg   emit_insn (gen_m2subrf4_cond (d1, cond, b, g3, g3, zero, status1, trunc_off));
   1216  1.1  mrg   /* g4 = g3 + (d1 * h3)		*/
   1217  1.1  mrg   emit_insn (gen_m2addrf4_cond (g4, cond, g3, d1, h3, y, status1, trunc_off));
   1218  1.1  mrg   /* Conversion back into SFmode.       */
   1219  1.1  mrg   emit_insn (gen_truncrfxf2 (operands[0], g4));
   1220  1.1  mrg   DONE;
   1221  1.1  mrg })
   1222