Home | History | Annotate | Line # | Download | only in rs6000
dfp.md revision 1.1.1.7
      1      1.1  mrg ;; Decimal Floating Point (DFP) patterns.
      2  1.1.1.7  mrg ;; Copyright (C) 2007-2018 Free Software Foundation, Inc.
      3      1.1  mrg ;; Contributed by Ben Elliston (bje (a] au.ibm.com) and Peter Bergner
      4      1.1  mrg ;; (bergner (a] vnet.ibm.com).
      5      1.1  mrg 
      6      1.1  mrg ;; This file is part of GCC.
      7      1.1  mrg 
      8      1.1  mrg ;; GCC is free software; you can redistribute it and/or modify it
      9      1.1  mrg ;; under the terms of the GNU General Public License as published
     10      1.1  mrg ;; by the Free Software Foundation; either version 3, or (at your
     11      1.1  mrg ;; option) any later version.
     12      1.1  mrg 
     13      1.1  mrg ;; GCC is distributed in the hope that it will be useful, but WITHOUT
     14      1.1  mrg ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
     15      1.1  mrg ;; or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
     16      1.1  mrg ;; License for more details.
     17      1.1  mrg 
     18      1.1  mrg ;; You should have received a copy of the GNU General Public License
     19      1.1  mrg ;; along with GCC; see the file COPYING3.  If not see
     20      1.1  mrg ;; <http://www.gnu.org/licenses/>.
     21      1.1  mrg 
     22      1.1  mrg ;;
     23      1.1  mrg ;; UNSPEC usage
     24      1.1  mrg ;;
     25      1.1  mrg 
     26  1.1.1.2  mrg (define_c_enum "unspec"
     27  1.1.1.2  mrg   [UNSPEC_MOVSD_LOAD
     28  1.1.1.2  mrg    UNSPEC_MOVSD_STORE
     29      1.1  mrg   ])
     30      1.1  mrg 
     31      1.1  mrg 
     32      1.1  mrg (define_insn "movsd_store"
     33      1.1  mrg   [(set (match_operand:DD 0 "nonimmediate_operand" "=m")
     34      1.1  mrg 	(unspec:DD [(match_operand:SD 1 "input_operand" "d")]
     35      1.1  mrg 		   UNSPEC_MOVSD_STORE))]
     36      1.1  mrg   "(gpc_reg_operand (operands[0], DDmode)
     37      1.1  mrg    || gpc_reg_operand (operands[1], SDmode))
     38  1.1.1.7  mrg    && TARGET_HARD_FLOAT"
     39      1.1  mrg   "stfd%U0%X0 %1,%0"
     40  1.1.1.3  mrg   [(set_attr "type" "fpstore")
     41      1.1  mrg    (set_attr "length" "4")])
     42      1.1  mrg 
     43      1.1  mrg (define_insn "movsd_load"
     44      1.1  mrg   [(set (match_operand:SD 0 "nonimmediate_operand" "=f")
     45      1.1  mrg 	(unspec:SD [(match_operand:DD 1 "input_operand" "m")]
     46      1.1  mrg 		   UNSPEC_MOVSD_LOAD))]
     47      1.1  mrg   "(gpc_reg_operand (operands[0], SDmode)
     48      1.1  mrg    || gpc_reg_operand (operands[1], DDmode))
     49  1.1.1.7  mrg    && TARGET_HARD_FLOAT"
     50      1.1  mrg   "lfd%U1%X1 %0,%1"
     51  1.1.1.3  mrg   [(set_attr "type" "fpload")
     52      1.1  mrg    (set_attr "length" "4")])
     53      1.1  mrg 
     54      1.1  mrg ;; Hardware support for decimal floating point operations.
     55      1.1  mrg 
     56      1.1  mrg (define_insn "extendsddd2"
     57      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
     58      1.1  mrg 	(float_extend:DD (match_operand:SD 1 "gpc_reg_operand" "f")))]
     59      1.1  mrg   "TARGET_DFP"
     60      1.1  mrg   "dctdp %0,%1"
     61  1.1.1.5  mrg   [(set_attr "type" "dfp")])
     62      1.1  mrg 
     63      1.1  mrg (define_expand "extendsdtd2"
     64      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
     65      1.1  mrg 	(float_extend:TD (match_operand:SD 1 "gpc_reg_operand" "d")))]
     66      1.1  mrg   "TARGET_DFP"
     67      1.1  mrg {
     68      1.1  mrg   rtx tmp = gen_reg_rtx (DDmode);
     69      1.1  mrg   emit_insn (gen_extendsddd2 (tmp, operands[1]));
     70      1.1  mrg   emit_insn (gen_extendddtd2 (operands[0], tmp));
     71      1.1  mrg   DONE;
     72      1.1  mrg })
     73      1.1  mrg 
     74      1.1  mrg (define_insn "truncddsd2"
     75      1.1  mrg   [(set (match_operand:SD 0 "gpc_reg_operand" "=f")
     76      1.1  mrg 	(float_truncate:SD (match_operand:DD 1 "gpc_reg_operand" "d")))]
     77      1.1  mrg   "TARGET_DFP"
     78      1.1  mrg   "drsp %0,%1"
     79  1.1.1.5  mrg   [(set_attr "type" "dfp")])
     80      1.1  mrg 
     81  1.1.1.7  mrg (define_insn "negdd2"
     82      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
     83      1.1  mrg 	(neg:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
     84  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
     85      1.1  mrg   "fneg %0,%1"
     86  1.1.1.5  mrg   [(set_attr "type" "fpsimple")])
     87      1.1  mrg 
     88  1.1.1.7  mrg (define_insn "absdd2"
     89      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
     90      1.1  mrg 	(abs:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
     91  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
     92      1.1  mrg   "fabs %0,%1"
     93  1.1.1.5  mrg   [(set_attr "type" "fpsimple")])
     94      1.1  mrg 
     95      1.1  mrg (define_insn "*nabsdd2_fpr"
     96      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
     97      1.1  mrg 	(neg:DD (abs:DD (match_operand:DD 1 "gpc_reg_operand" "d"))))]
     98  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
     99      1.1  mrg   "fnabs %0,%1"
    100  1.1.1.5  mrg   [(set_attr "type" "fpsimple")])
    101      1.1  mrg 
    102  1.1.1.7  mrg (define_insn "negtd2"
    103  1.1.1.2  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
    104  1.1.1.2  mrg 	(neg:TD (match_operand:TD 1 "gpc_reg_operand" "0,d")))]
    105  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
    106  1.1.1.2  mrg   "@
    107  1.1.1.2  mrg    fneg %0,%1
    108  1.1.1.2  mrg    fneg %0,%1\;fmr %L0,%L1"
    109  1.1.1.5  mrg   [(set_attr "type" "fpsimple")
    110  1.1.1.2  mrg    (set_attr "length" "4,8")])
    111      1.1  mrg 
    112  1.1.1.7  mrg (define_insn "abstd2"
    113  1.1.1.2  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
    114  1.1.1.2  mrg 	(abs:TD (match_operand:TD 1 "gpc_reg_operand" "0,d")))]
    115  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
    116  1.1.1.2  mrg   "@
    117  1.1.1.2  mrg    fabs %0,%1
    118  1.1.1.2  mrg    fabs %0,%1\;fmr %L0,%L1"
    119  1.1.1.5  mrg   [(set_attr "type" "fpsimple")
    120  1.1.1.2  mrg    (set_attr "length" "4,8")])
    121      1.1  mrg 
    122      1.1  mrg (define_insn "*nabstd2_fpr"
    123  1.1.1.2  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d,d")
    124  1.1.1.2  mrg 	(neg:TD (abs:TD (match_operand:TD 1 "gpc_reg_operand" "0,d"))))]
    125  1.1.1.7  mrg   "TARGET_HARD_FLOAT"
    126  1.1.1.2  mrg   "@
    127  1.1.1.2  mrg    fnabs %0,%1
    128  1.1.1.2  mrg    fnabs %0,%1\;fmr %L0,%L1"
    129  1.1.1.5  mrg   [(set_attr "type" "fpsimple")
    130  1.1.1.2  mrg    (set_attr "length" "4,8")])
    131      1.1  mrg 
    132      1.1  mrg ;; Hardware support for decimal floating point operations.
    133      1.1  mrg 
    134      1.1  mrg (define_insn "extendddtd2"
    135      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    136      1.1  mrg 	(float_extend:TD (match_operand:DD 1 "gpc_reg_operand" "d")))]
    137      1.1  mrg   "TARGET_DFP"
    138      1.1  mrg   "dctqpq %0,%1"
    139  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    140      1.1  mrg 
    141      1.1  mrg ;; The result of drdpq is an even/odd register pair with the converted
    142      1.1  mrg ;; value in the even register and zero in the odd register.
    143      1.1  mrg ;; FIXME: Avoid the register move by using a reload constraint to ensure
    144      1.1  mrg ;; that the result is the first of the pair receiving the result of drdpq.
    145      1.1  mrg 
    146      1.1  mrg (define_insn "trunctddd2"
    147      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    148      1.1  mrg 	(float_truncate:DD (match_operand:TD 1 "gpc_reg_operand" "d")))
    149      1.1  mrg    (clobber (match_scratch:TD 2 "=d"))]
    150      1.1  mrg   "TARGET_DFP"
    151      1.1  mrg   "drdpq %2,%1\;fmr %0,%2"
    152  1.1.1.6  mrg   [(set_attr "type" "dfp")
    153  1.1.1.6  mrg    (set_attr "length" "8")])
    154      1.1  mrg 
    155      1.1  mrg (define_insn "adddd3"
    156      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    157      1.1  mrg 	(plus:DD (match_operand:DD 1 "gpc_reg_operand" "%d")
    158      1.1  mrg 		 (match_operand:DD 2 "gpc_reg_operand" "d")))]
    159      1.1  mrg   "TARGET_DFP"
    160      1.1  mrg   "dadd %0,%1,%2"
    161  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    162      1.1  mrg 
    163      1.1  mrg (define_insn "addtd3"
    164      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    165      1.1  mrg 	(plus:TD (match_operand:TD 1 "gpc_reg_operand" "%d")
    166      1.1  mrg 		 (match_operand:TD 2 "gpc_reg_operand" "d")))]
    167      1.1  mrg   "TARGET_DFP"
    168      1.1  mrg   "daddq %0,%1,%2"
    169  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    170      1.1  mrg 
    171      1.1  mrg (define_insn "subdd3"
    172      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    173      1.1  mrg 	(minus:DD (match_operand:DD 1 "gpc_reg_operand" "d")
    174      1.1  mrg 		  (match_operand:DD 2 "gpc_reg_operand" "d")))]
    175      1.1  mrg   "TARGET_DFP"
    176      1.1  mrg   "dsub %0,%1,%2"
    177  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    178      1.1  mrg 
    179      1.1  mrg (define_insn "subtd3"
    180      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    181      1.1  mrg 	(minus:TD (match_operand:TD 1 "gpc_reg_operand" "d")
    182      1.1  mrg 		  (match_operand:TD 2 "gpc_reg_operand" "d")))]
    183      1.1  mrg   "TARGET_DFP"
    184      1.1  mrg   "dsubq %0,%1,%2"
    185  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    186      1.1  mrg 
    187      1.1  mrg (define_insn "muldd3"
    188      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    189      1.1  mrg 	(mult:DD (match_operand:DD 1 "gpc_reg_operand" "%d")
    190      1.1  mrg 		 (match_operand:DD 2 "gpc_reg_operand" "d")))]
    191      1.1  mrg   "TARGET_DFP"
    192      1.1  mrg   "dmul %0,%1,%2"
    193  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    194      1.1  mrg 
    195      1.1  mrg (define_insn "multd3"
    196      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    197      1.1  mrg 	(mult:TD (match_operand:TD 1 "gpc_reg_operand" "%d")
    198      1.1  mrg 		 (match_operand:TD 2 "gpc_reg_operand" "d")))]
    199      1.1  mrg   "TARGET_DFP"
    200      1.1  mrg   "dmulq %0,%1,%2"
    201  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    202      1.1  mrg 
    203      1.1  mrg (define_insn "divdd3"
    204      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    205      1.1  mrg 	(div:DD (match_operand:DD 1 "gpc_reg_operand" "d")
    206      1.1  mrg 		(match_operand:DD 2 "gpc_reg_operand" "d")))]
    207      1.1  mrg   "TARGET_DFP"
    208      1.1  mrg   "ddiv %0,%1,%2"
    209  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    210      1.1  mrg 
    211      1.1  mrg (define_insn "divtd3"
    212      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    213      1.1  mrg 	(div:TD (match_operand:TD 1 "gpc_reg_operand" "d")
    214      1.1  mrg 		(match_operand:TD 2 "gpc_reg_operand" "d")))]
    215      1.1  mrg   "TARGET_DFP"
    216      1.1  mrg   "ddivq %0,%1,%2"
    217  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    218      1.1  mrg 
    219      1.1  mrg (define_insn "*cmpdd_internal1"
    220      1.1  mrg   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
    221      1.1  mrg 	(compare:CCFP (match_operand:DD 1 "gpc_reg_operand" "d")
    222      1.1  mrg 		      (match_operand:DD 2 "gpc_reg_operand" "d")))]
    223      1.1  mrg   "TARGET_DFP"
    224      1.1  mrg   "dcmpu %0,%1,%2"
    225  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    226      1.1  mrg 
    227      1.1  mrg (define_insn "*cmptd_internal1"
    228      1.1  mrg   [(set (match_operand:CCFP 0 "cc_reg_operand" "=y")
    229      1.1  mrg 	(compare:CCFP (match_operand:TD 1 "gpc_reg_operand" "d")
    230      1.1  mrg 		      (match_operand:TD 2 "gpc_reg_operand" "d")))]
    231      1.1  mrg   "TARGET_DFP"
    232      1.1  mrg   "dcmpuq %0,%1,%2"
    233  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    234      1.1  mrg 
    235  1.1.1.2  mrg (define_insn "floatdidd2"
    236  1.1.1.2  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    237  1.1.1.2  mrg 	(float:DD (match_operand:DI 1 "gpc_reg_operand" "d")))]
    238  1.1.1.2  mrg   "TARGET_DFP && TARGET_POPCNTD"
    239  1.1.1.2  mrg   "dcffix %0,%1"
    240  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    241  1.1.1.2  mrg 
    242      1.1  mrg (define_insn "floatditd2"
    243      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    244      1.1  mrg 	(float:TD (match_operand:DI 1 "gpc_reg_operand" "d")))]
    245      1.1  mrg   "TARGET_DFP"
    246      1.1  mrg   "dcffixq %0,%1"
    247  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    248      1.1  mrg 
    249      1.1  mrg ;; Convert a decimal64 to a decimal64 whose value is an integer.
    250      1.1  mrg ;; This is the first stage of converting it to an integer type.
    251      1.1  mrg 
    252      1.1  mrg (define_insn "ftruncdd2"
    253      1.1  mrg   [(set (match_operand:DD 0 "gpc_reg_operand" "=d")
    254      1.1  mrg 	(fix:DD (match_operand:DD 1 "gpc_reg_operand" "d")))]
    255      1.1  mrg   "TARGET_DFP"
    256      1.1  mrg   "drintn. 0,%0,%1,1"
    257  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    258      1.1  mrg 
    259      1.1  mrg ;; Convert a decimal64 whose value is an integer to an actual integer.
    260      1.1  mrg ;; This is the second stage of converting decimal float to integer type.
    261      1.1  mrg 
    262      1.1  mrg (define_insn "fixdddi2"
    263      1.1  mrg   [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
    264      1.1  mrg 	(fix:DI (match_operand:DD 1 "gpc_reg_operand" "d")))]
    265      1.1  mrg   "TARGET_DFP"
    266      1.1  mrg   "dctfix %0,%1"
    267  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    268      1.1  mrg 
    269      1.1  mrg ;; Convert a decimal128 to a decimal128 whose value is an integer.
    270      1.1  mrg ;; This is the first stage of converting it to an integer type.
    271      1.1  mrg 
    272      1.1  mrg (define_insn "ftrunctd2"
    273      1.1  mrg   [(set (match_operand:TD 0 "gpc_reg_operand" "=d")
    274      1.1  mrg 	(fix:TD (match_operand:TD 1 "gpc_reg_operand" "d")))]
    275      1.1  mrg   "TARGET_DFP"
    276      1.1  mrg   "drintnq. 0,%0,%1,1"
    277  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    278      1.1  mrg 
    279      1.1  mrg ;; Convert a decimal128 whose value is an integer to an actual integer.
    280      1.1  mrg ;; This is the second stage of converting decimal float to integer type.
    281      1.1  mrg 
    282      1.1  mrg (define_insn "fixtddi2"
    283      1.1  mrg   [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
    284      1.1  mrg 	(fix:DI (match_operand:TD 1 "gpc_reg_operand" "d")))]
    285      1.1  mrg   "TARGET_DFP"
    286      1.1  mrg   "dctfixq %0,%1"
    287  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    288  1.1.1.2  mrg 
    289  1.1.1.2  mrg 
    291  1.1.1.2  mrg ;; Decimal builtin support
    292  1.1.1.2  mrg 
    293  1.1.1.2  mrg (define_c_enum "unspec"
    294  1.1.1.2  mrg   [UNSPEC_DDEDPD
    295  1.1.1.2  mrg    UNSPEC_DENBCD
    296  1.1.1.2  mrg    UNSPEC_DXEX
    297  1.1.1.2  mrg    UNSPEC_DIEX
    298  1.1.1.5  mrg    UNSPEC_DSCLI
    299  1.1.1.2  mrg    UNSPEC_DTSTSFI
    300  1.1.1.2  mrg    UNSPEC_DSCRI])
    301  1.1.1.5  mrg 
    302  1.1.1.5  mrg (define_code_iterator DFP_TEST [eq lt gt unordered])
    303  1.1.1.2  mrg 
    304  1.1.1.2  mrg (define_mode_iterator D64_D128 [DD TD])
    305  1.1.1.2  mrg 
    306  1.1.1.2  mrg (define_mode_attr dfp_suffix [(DD "")
    307  1.1.1.2  mrg 			      (TD "q")])
    308  1.1.1.2  mrg 
    309  1.1.1.2  mrg (define_insn "dfp_ddedpd_<mode>"
    310  1.1.1.2  mrg   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
    311  1.1.1.2  mrg 	(unspec:D64_D128 [(match_operand:QI 1 "const_0_to_3_operand" "i")
    312  1.1.1.2  mrg 			  (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
    313  1.1.1.2  mrg 			 UNSPEC_DDEDPD))]
    314  1.1.1.2  mrg   "TARGET_DFP"
    315  1.1.1.5  mrg   "ddedpd<dfp_suffix> %1,%0,%2"
    316  1.1.1.2  mrg   [(set_attr "type" "dfp")])
    317  1.1.1.2  mrg 
    318  1.1.1.2  mrg (define_insn "dfp_denbcd_<mode>"
    319  1.1.1.2  mrg   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
    320  1.1.1.2  mrg 	(unspec:D64_D128 [(match_operand:QI 1 "const_0_to_1_operand" "i")
    321  1.1.1.2  mrg 			  (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
    322  1.1.1.2  mrg 			 UNSPEC_DENBCD))]
    323  1.1.1.2  mrg   "TARGET_DFP"
    324  1.1.1.5  mrg   "denbcd<dfp_suffix> %1,%0,%2"
    325  1.1.1.2  mrg   [(set_attr "type" "dfp")])
    326  1.1.1.2  mrg 
    327  1.1.1.4  mrg (define_insn "dfp_dxex_<mode>"
    328  1.1.1.4  mrg   [(set (match_operand:DI 0 "gpc_reg_operand" "=d")
    329  1.1.1.4  mrg 	(unspec:DI [(match_operand:D64_D128 1 "gpc_reg_operand" "d")]
    330  1.1.1.2  mrg 		   UNSPEC_DXEX))]
    331  1.1.1.2  mrg   "TARGET_DFP"
    332  1.1.1.5  mrg   "dxex<dfp_suffix> %0,%1"
    333  1.1.1.2  mrg   [(set_attr "type" "dfp")])
    334  1.1.1.2  mrg 
    335  1.1.1.2  mrg (define_insn "dfp_diex_<mode>"
    336  1.1.1.4  mrg   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
    337  1.1.1.2  mrg 	(unspec:D64_D128 [(match_operand:DI 1 "gpc_reg_operand" "d")
    338  1.1.1.2  mrg 			  (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
    339  1.1.1.2  mrg 			 UNSPEC_DXEX))]
    340  1.1.1.2  mrg   "TARGET_DFP"
    341  1.1.1.5  mrg   "diex<dfp_suffix> %0,%1,%2"
    342  1.1.1.5  mrg   [(set_attr "type" "dfp")])
    343  1.1.1.5  mrg 
    344  1.1.1.5  mrg (define_expand "dfptstsfi_<code>_<mode>"
    345  1.1.1.5  mrg   [(set (match_dup 3)
    346  1.1.1.5  mrg 	(compare:CCFP
    347  1.1.1.7  mrg          (unspec:D64_D128
    348  1.1.1.7  mrg 	  [(match_operand:SI 1 "const_int_operand")
    349  1.1.1.5  mrg 	   (match_operand:D64_D128 2 "gpc_reg_operand")]
    350  1.1.1.5  mrg 	  UNSPEC_DTSTSFI)
    351  1.1.1.7  mrg 	 (match_dup 4)))
    352  1.1.1.5  mrg    (set (match_operand:SI 0 "register_operand")
    353  1.1.1.5  mrg    	(DFP_TEST:SI (match_dup 3)
    354  1.1.1.5  mrg 		     (const_int 0)))
    355  1.1.1.5  mrg   ]
    356  1.1.1.5  mrg   "TARGET_P9_MISC"
    357  1.1.1.5  mrg {
    358  1.1.1.5  mrg   operands[3] = gen_reg_rtx (CCFPmode);
    359  1.1.1.5  mrg   operands[4] = const0_rtx;
    360  1.1.1.5  mrg })
    361  1.1.1.5  mrg 
    362  1.1.1.5  mrg (define_insn "*dfp_sgnfcnc_<mode>"
    363  1.1.1.5  mrg   [(set (match_operand:CCFP 0 "" "=y")
    364  1.1.1.5  mrg         (compare:CCFP
    365  1.1.1.5  mrg 	 (unspec:D64_D128 [(match_operand:SI 1 "const_int_operand" "n")
    366  1.1.1.5  mrg 	 	           (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
    367  1.1.1.5  mrg           UNSPEC_DTSTSFI)
    368  1.1.1.5  mrg 	 (match_operand:SI 3 "zero_constant" "j")))]
    369  1.1.1.5  mrg   "TARGET_P9_MISC"
    370  1.1.1.5  mrg {
    371  1.1.1.5  mrg   /* If immediate operand is greater than 63, it will behave as if
    372  1.1.1.5  mrg      the value had been 63.  The code generator does not support
    373  1.1.1.5  mrg      immediate operand values greater than 63.  */
    374  1.1.1.5  mrg   if (!(IN_RANGE (INTVAL (operands[1]), 0, 63)))
    375  1.1.1.5  mrg     operands[1] = GEN_INT (63);
    376  1.1.1.5  mrg   return "dtstsfi<dfp_suffix> %0,%1,%2";
    377  1.1.1.2  mrg }
    378  1.1.1.2  mrg   [(set_attr "type" "fp")])
    379  1.1.1.2  mrg 
    380  1.1.1.2  mrg (define_insn "dfp_dscli_<mode>"
    381  1.1.1.2  mrg   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
    382  1.1.1.2  mrg 	(unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
    383  1.1.1.2  mrg 			  (match_operand:QI 2 "immediate_operand" "i")]
    384  1.1.1.2  mrg 			 UNSPEC_DSCLI))]
    385  1.1.1.2  mrg   "TARGET_DFP"
    386  1.1.1.5  mrg   "dscli<dfp_suffix> %0,%1,%2"
    387  1.1.1.2  mrg   [(set_attr "type" "dfp")])
    388  1.1.1.2  mrg 
    389  1.1.1.2  mrg (define_insn "dfp_dscri_<mode>"
    390  1.1.1.2  mrg   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
    391  1.1.1.2  mrg 	(unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
    392  1.1.1.2  mrg 			  (match_operand:QI 2 "immediate_operand" "i")]
    393  1.1.1.2  mrg 			 UNSPEC_DSCRI))]
    394  1.1.1.2  mrg   "TARGET_DFP"
    395  1.1.1.5  mrg   "dscri<dfp_suffix> %0,%1,%2"
    396                 [(set_attr "type" "dfp")])
    397